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
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
php面向对象的方法重载两种版本比较
Sep 08 PHP
PHPCMS的使用小结
Sep 20 PHP
一个经典的PHP文件上传类分享
Nov 18 PHP
php实现递归的三种基本方式
Jul 04 PHP
简单概括PHP的字符串中单引号与双引号的区别
May 07 PHP
PHP抓取远程图片(含不带后缀的)教程详解
Oct 21 PHP
利用PHP判断文件是否为图片的方法总结
Jan 06 PHP
php微信公众号开发之图片回复
Oct 20 PHP
php微信公众号开发之音乐信息
Oct 20 PHP
php实现session共享的实例方法
Sep 19 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调用mysql存储过程
2007/02/14 PHP
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
PHP网站备份程序代码分享
2011/06/10 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
php实现word转html的方法
2016/01/22 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
使用Python的判断语句模拟三目运算
2015/04/24 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
python实现字符串和数字拼接
2020/03/02 Python
python实现吃苹果小游戏
2020/03/21 Python
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
迟到检讨书1000字
2014/01/15 职场文书
《纸船和风筝》教学反思
2014/02/15 职场文书
市场营销求职信范文
2014/02/21 职场文书
新学期决心书
2014/03/11 职场文书
民主评议党员总结
2014/10/20 职场文书
商超业务员岗位职责
2015/02/13 职场文书
停水通知
2015/04/16 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书