PHP笛卡尔积实现原理及代码实例


Posted in PHP onDecember 09, 2020

笛卡尔积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X*Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。

假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}

实现思路

先计算第一个集合和第二个集合的笛卡尔积,把结果保存为一个新集合。
然后再用新集合与下一个集合计算笛卡尔积,依此循环直到与最后一个集合计算笛卡尔积。

例如有以下几个集合,需要计算笛卡尔积

<?php
$sets = array(
array('白色','黑色','红色'),
array('透气','防滑'),
array('37码','38码','39码'),
array('男款','女款')
);
?>

代码如下:

<?php
/**
 * php 计算多个集合的笛卡尔积
 * Date: 2017-01-10
 * Author: fdipzone
 * Ver: 1.0
 *
 * Func
 * CartesianProduct 计算多个集合的笛卡尔积
 */
 
/**
 * 计算多个集合的笛卡尔积
 * @param Array $sets 集合数组
 * @return Array
 */
function CartesianProduct($sets){
 
 // 保存结果
 $result = array();
 
 // 循环遍历集合数据
 for($i=0,$count=count($sets); $i<$count-1; $i++){
 
 // 初始化
 if($i==0){
 $result = $sets[$i];
 }
 
 // 保存临时数据
 $tmp = array();
 
 // 结果与下一个集合计算笛卡尔积
 foreach($result as $res){
 foreach($sets[$i+1] as $set){
 $tmp[] = $res.$set;
 }
 }
 
 // 将笛卡尔积写入结果
 $result = $tmp;
 
 }
 
 return $result;
 
}
 
// 定义集合
$sets = array(
 array('白色','黑色','红色'),
 array('透气','防滑'),
 array('37码','38码','39码'),
 array('男款','女款')
);
 
$result = CartesianProduct($sets);
print_r($result);
 
?>

输出:

Array
(
 [0] => 白色透气37码男款
 [1] => 白色透气37码女款
 [2] => 白色透气38码男款
 [3] => 白色透气38码女款
 [4] => 白色透气39码男款
 [5] => 白色透气39码女款
 [6] => 白色防滑37码男款
 [7] => 白色防滑37码女款
 [8] => 白色防滑38码男款
 [9] => 白色防滑38码女款
 [10] => 白色防滑39码男款
 [11] => 白色防滑39码女款
 [12] => 黑色透气37码男款
 [13] => 黑色透气37码女款
 [14] => 黑色透气38码男款
 [15] => 黑色透气38码女款
 [16] => 黑色透气39码男款
 [17] => 黑色透气39码女款
 [18] => 黑色防滑37码男款
 [19] => 黑色防滑37码女款
 [20] => 黑色防滑38码男款
 [21] => 黑色防滑38码女款
 [22] => 黑色防滑39码男款
 [23] => 黑色防滑39码女款
 [24] => 红色透气37码男款
 [25] => 红色透气37码女款
 [26] => 红色透气38码男款
 [27] => 红色透气38码女款
 [28] => 红色透气39码男款
 [29] => 红色透气39码女款
 [30] => 红色防滑37码男款
 [31] => 红色防滑37码女款
 [32] => 红色防滑38码男款
 [33] => 红色防滑38码女款
 [34] => 红色防滑39码男款
 [35] => 红色防滑39码女款
)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP实现采集程序原理和简单示例代码
Mar 18 PHP
php magic_quotes_gpc的一点认识与分析
Aug 18 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 PHP
php引用返回与取消引用的详解
Jun 08 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
php绘图之在图片上写中文和英文的方法
Jan 24 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
PHP实现的DES加密解密实例代码
Apr 06 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
Jul 20 PHP
PHP文件操作详解
Dec 30 PHP
php支付宝APP支付功能
Jul 29 PHP
PHP基于进程控制函数实现多线程
Dec 09 #PHP
PHP如何防止用户重复提交表单
Dec 09 #PHP
Nginx+php配置文件及原理解析
Dec 09 #PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 #PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 09 #PHP
PhpStorm连接服务器并实现自动上传功能
Dec 09 #PHP
PHP大文件分割分片上传实现代码
Dec 09 #PHP
You might like
PHP 高手之路(二)
2006/10/09 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
Apache PHP MySql安装配置图文教程
2016/08/27 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
js实现楼层导航功能
2017/02/23 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
2017/12/27 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
Python设计模式之观察者模式实例
2014/04/26 Python
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
Python中字符串与编码示例代码
2019/05/20 Python
Python中如何添加自定义模块
2020/06/09 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
网络技术支持面试题
2013/04/22 面试题
高分子材料与工程专业推荐信
2013/12/01 职场文书
周年庆典邀请函范文
2014/01/23 职场文书
项目施工员岗位职责
2014/03/09 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
三峡大坝导游词
2015/01/31 职场文书
tree shaking对打包体积优化及作用
2022/07/07 Java/Android