php计算多个集合的笛卡尔积实例详解


Posted in PHP onFebruary 16, 2017

笛卡尔积

笛卡尔积是指在数学中,两个集合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能带来一定的帮助,如果有疑问大家可以留言交流。

PHP 相关文章推荐
随时给自己贴的图片加文字的php水印
Mar 16 PHP
用mysql触发器自动更新memcache的实现代码
Oct 11 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
Jun 13 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
一个经典的PHP文件上传类分享
Nov 18 PHP
WordPress自定义时间显示格式
Mar 27 PHP
PHP封装的字符串加密解密函数
Dec 18 PHP
laravel5创建service provider和facade的方法详解
Jul 26 PHP
thinkPHP5实现数据库添加内容的方法
Oct 25 PHP
PHP与Perl之间知识点区别整理
Mar 19 PHP
php实现文件与16进制相互转换的方法示例
Feb 16 #PHP
php根据用户名和手机号查询是否存在手机号码
Feb 16 #PHP
php使用PDO执行SQL语句的方法分析
Feb 16 #PHP
php四种定界符详解
Feb 16 #PHP
php使用PDO获取结果集的方法
Feb 16 #PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 #PHP
php实现PDO中捕获SQL语句错误的方法
Feb 16 #PHP
You might like
Thinkphp5 如何隐藏入口文件index.php(URL重写)
2019/10/16 PHP
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
js获取视频时长代码
2014/04/10 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
jQuery知识点整理
2015/01/30 Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
2016/10/10 Javascript
js利用clipboardData实现截屏粘贴功能
2016/10/12 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
python执行外部程序的常用方法小结
2015/03/21 Python
python基于socket实现网络广播的方法
2015/04/29 Python
python3操作mysql数据库的方法
2017/06/23 Python
python逐行读写txt文件的实例讲解
2018/04/03 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
python判断数字是否是超级素数幂
2018/09/27 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
美国网上花店:JustFlowers
2017/02/12 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
颐和园导游词400字
2015/01/30 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
教师节寄语2015
2015/03/23 职场文书
离职告别感言
2015/08/04 职场文书
改进工作作风心得体会
2016/01/23 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android