笛卡尔(Descartes)乘积又叫直积。设A、B是任意两个集合,在集合A中任意取一个元素x,在集合B中任意取一个元素y,组成一个有序对(x,y),把这样的有序对作为新的元素,他们的全体组成的集合称为集合A和集合B的直积,记为A×B,即A×B={(x,y)|x∈A且y∈B}。
function Descartes() { $t = func_get_args(); if(func_num_args() == 1) return call_user_func_array( __FUNCTION__, $t[0] ); $a = array_shift($t); if(! is_array($a)) $a = array($a); $a = array_chunk($a, 1); do { $r = array(); $b = array_shift($t); if(! is_array($b)) $b = array($b); foreach($a as $p) foreach(array_chunk($b, 1) as $q) $r[] = array_merge($p, $q); $a = $r; }while($t); return $r; }
示例
$arr = array( array(a1,a2,), b, array(c1,c2,), array(d1,d2,d3), //......省略其它元素(也可以是数组), ); $r = Descartes( $arr );
结果
Array ( [0] => Array ( [0] => a1 [1] => b [2] => c1 [3] => d1 ) [1] => Array ( [0] => a1 [1] => b [2] => c1 [3] => d2 ) [2] => Array ( [0] => a1 [1] => b [2] => c1 [3] => d3 ) [3] => Array ( [0] => a1 [1] => b [2] => c2 [3] => d1 ) [4] => Array ( [0] => a1 [1] => b [2] => c2 [3] => d2 ) [5] => Array ( [0] => a1 [1] => b [2] => c2 [3] => d3 ) [6] => Array ( [0] => a2 [1] => b [2] => c1 [3] => d1 ) [7] => Array ( [0] => a2 [1] => b [2] => c1 [3] => d2 ) [8] => Array ( [0] => a2 [1] => b [2] => c1 [3] => d3 ) [9] => Array ( [0] => a2 [1] => b [2] => c2 [3] => d1 ) [10] => Array ( [0] => a2 [1] => b [2] => c2 [3] => d2 ) [11] => Array ( [0] => a2 [1] => b [2] => c2 [3] => d3 ) )