笛卡尔(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
)
)