/*--------------------------------------
*+多数组求笛卡尔积
*--------------------------------------
*/
笛卡尔(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‘,‘a3‘), ‘b‘, array(‘c1‘,‘c2‘), array(‘d1‘,‘d2‘,‘d3‘), //......省略其它元素(也可以是数组), ); $r = Descartes( $arr ); var_dump($r);exit; /*array(18) { [0]=> array(4) { [0]=> string(2) "a1" [1]=> string(1) "b" [2]=> string(2) "c1" [3]=> string(2) "d1" } [1]=> array(4) { [0]=> string(2) "a1" [1]=> string(1) "b" [2]=> string(2) "c1" [3]=> string(2) "d2" } [2]=> array(4) { [0]=> string(2) "a1" [1]=> string(1) "b" [2]=> string(2) "c1" [3]=> string(2) "d3" } [3]=> array(4) { [0]=> string(2) "a1" [1]=> string(1) "b" [2]=> string(2) "c2" [3]=> string(2) "d1" } [4]=> array(4) { [0]=> string(2) "a1" [1]=> string(1) "b" [2]=> string(2) "c2" [3]=> string(2) "d2" } [5]=> array(4) { [0]=> string(2) "a1" [1]=> string(1) "b" [2]=> string(2) "c2" [3]=> string(2) "d3" } [6]=> array(4) { [0]=> string(2) "a2" [1]=> string(1) "b" [2]=> string(2) "c1" [3]=> string(2) "d1" } [7]=> array(4) { [0]=> string(2) "a2" [1]=> string(1) "b" [2]=> string(2) "c1" [3]=> string(2) "d2" } [8]=> array(4) { [0]=> string(2) "a2" [1]=> string(1) "b" [2]=> string(2) "c1" [3]=> string(2) "d3" } [9]=> array(4) { [0]=> string(2) "a2" [1]=> string(1) "b" [2]=> string(2) "c2" [3]=> string(2) "d1" } [10]=> array(4) { [0]=> string(2) "a2" [1]=> string(1) "b" [2]=> string(2) "c2" [3]=> string(2) "d2" } [11]=> array(4) { [0]=> string(2) "a2" [1]=> string(1) "b" [2]=> string(2) "c2" [3]=> string(2) "d3" } [12]=> array(4) { [0]=> string(2) "a3" [1]=> string(1) "b" [2]=> string(2) "c1" [3]=> string(2) "d1" } [13]=> array(4) { [0]=> string(2) "a3" [1]=> string(1) "b" [2]=> string(2) "c1" [3]=> string(2) "d2" } [14]=> array(4) { [0]=> string(2) "a3" [1]=> string(1) "b" [2]=> string(2) "c1" [3]=> string(2) "d3" } [15]=> array(4) { [0]=> string(2) "a3" [1]=> string(1) "b" [2]=> string(2) "c2" [3]=> string(2) "d1" } [16]=> array(4) { [0]=> string(2) "a3" [1]=> string(1) "b" [2]=> string(2) "c2" [3]=> string(2) "d2" } [17]=> array(4) { [0]=> string(2) "a3" [1]=> string(1) "b" [2]=> string(2) "c2" [3]=> string(2) "d3" } } */
时间: 2024-11-03 22:36:41