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初学者头痛的十四个问题
Jul 12 PHP
PHP令牌 Token改进版
Jul 18 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
Nov 10 PHP
php中socket的用法详解
Oct 24 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
基于CI框架的微信网页授权库示例
Nov 25 PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
PHP使用函数用法详解
Sep 30 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
Dec 25 PHP
PHP实现浏览器格式化显示XML的方法示例
Jan 22 PHP
PHP文件上传小程序 适合初学者学习!
May 23 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
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
PHP中上传文件打印错误错误类型分析
2019/04/14 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
js变量作用域及可访问性的探讨
2006/11/23 Javascript
js停止输出代码
2008/07/20 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
JQueryMiniUI按照时间进行查询的实现方法
2017/06/07 jQuery
基于vue2实现上拉加载功能
2017/11/28 Javascript
详解vue-cli官方脚手架配置
2018/07/20 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
js中addEventListener()与removeEventListener()用法案例分析
2020/03/02 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
Python卸载模块的方法汇总
2016/06/07 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
python实现在一个画布上画多个子图
2020/01/19 Python
什么是python的自省
2020/06/21 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
介绍Java的内部类
2012/10/27 面试题
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
实习生评语
2014/04/26 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
个人股份转让协议书范本
2014/10/26 职场文书