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执行速度全攻略(上)
Oct 09 PHP
php Static关键字实用方法
Jun 04 PHP
php与paypal整合方法
Nov 28 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
php学习笔记之基础知识
Nov 08 PHP
thinkphp配置连接数据库技巧
Dec 02 PHP
round robin权重轮循算法php实现代码
May 28 PHP
详解php中 === 的使用
Oct 24 PHP
thinkPHP5.0框架独立配置与动态配置方法
Mar 17 PHP
php json相关函数用法示例
Mar 28 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 28 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
php5.3 注意事项说明
2013/07/01 PHP
浅析php数据类型转换
2014/01/09 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
php强制下载文件函数
2016/08/24 PHP
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
子页向父页传值示例
2013/11/27 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
vue动态配置模板 'component is'代码
2019/07/04 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
pycharm 使用心得(四)显示行号
2014/06/05 Python
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
FC-Moto美国:欧洲最大的摩托车服装和头盔商店之一
2019/08/24 全球购物
介绍一下Python下range()函数的用法
2013/11/07 面试题
质量安全标语
2014/06/07 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
文明倡议书
2015/01/19 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
心理健康教育主题班会
2015/08/13 职场文书
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技