笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
方式一:
<?php
// 笛卡尔积
$color = array('red', 'green');
$size = array(39, 40, 41);
$local = array('M', 'L');
echo "<pre>";
print_r(combineDika($color, $size));
print_r(combineDika($color, $size, $local));
/**
* 所有数组的笛卡尔积
*/
function combineDika()
{
$data = func_get_args(); // 获取所有数据
$cnt = count($data); // 计算总数(用于循环)
$result = array(); // 结果数组
// 取出第一个元素遍历为二维数组
foreach($data[0] as $item) {
$result[] = array($item);
}
// return [$data, $result];
// 从第二元素开始循环
for($i = 1; $i < $cnt; $i++) {
$result = combineArray($result, $data[$i]); // 循环匹配
}
return $result;
}
/**
* 两个数组的笛卡尔积
* @param unknown_type $arr1
* @param unknown_type $arr2
*/
function combineArray($arr1, $arr2)
{
$result = array();
foreach ($arr1 as $item1) {
foreach ($arr2 as $item2) {
$temp = $item1;
$temp[] = $item2;
$result[] = $temp;
}
}
return $result;
}
方式二:
<?Php
$arr = array(
array(1,3,4,5),
array(3,5,7,9),
array(76,6,1,0)
);
/**
** 实现二维数组的笛卡尔积组合
** $arr 要进行笛卡尔积的二维数组
** $str 最终实现的笛卡尔积组合,可不写
** @return array
**/
function cartesian($arr, $str = array())
{
//去除第一个元素
$first = array_shift($arr);
//判断是否是第一次进行拼接
if(count($str) > 1) {
foreach ($str as $k => $val) {
foreach ($first as $key => $value) {
// 最终实现的格式 1,3,76
// 可根据具体需求进行变更
$str2[] = $val.','.$value;
}
}
} else {
foreach ($first as $key => $value) {
//最终实现的格式 1,3,76
//可根据具体需求进行变更
$str2[] = $value;
}
}
//递归进行拼接
if(count($arr) > 0) {
$str2 = cartesian($arr, $str2);
}
//返回最终笛卡尔积
return $str2;
}
$cartesian_product = cartesian($arr);
echo '<pre>';
print_r($cartesian_product);