笛卡尔乘积
笛卡尔乘积是指在数学中,两个集合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);
勿忘初心,方得始终。
愿茫茫人海,觅得贤妻,此生足矣!