后端开发 \ PHP \ php 计算多个集合的笛卡尔积

php 计算多个集合的笛卡尔积

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

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

假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),2),(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('白色','女款')

);

$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码女款

)

意见反馈 常见问题 官方微信 返回顶部