笛卡尔乘积代码:<?PHPfunction 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'),
array('e1','e2','e3')
//......省略其它元素(也可以是数组),
);
$r = Descartes( $arr );
print_r($r);
?>//////////////////////////////////////输出:Array
(
[0] => Array
(
[0] => a1
[1] => b
[2] => c1
[3] => d1
[4] => e1
)
[1] => Array
(
[0] => a1
[1] => b
[2] => c1
[3] => d1
[4] => e2
)
...
)
////////////////////
现在我只想要3个元素,第一个元素要有a1或a2。那段代码要怎么改?
Array
(
[0] => Array
(
[0] => a1
[1] => b
[2] => c1
)
......
[1] => Array
(
[0] => a2
[1] => c2
[2] => d3
)
......
)
$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'),
array('e1','e2','e3')
//......省略其它元素(也可以是数组),
);
$r = Descartes( $arr );
print_r($r);
?>//////////////////////////////////////输出:Array
(
[0] => Array
(
[0] => a1
[1] => b
[2] => c1
[3] => d1
[4] => e1
)
[1] => Array
(
[0] => a1
[1] => b
[2] => c1
[3] => d1
[4] => e2
)
...
)
////////////////////
现在我只想要3个元素,第一个元素要有a1或a2。那段代码要怎么改?
Array
(
[0] => Array
(
[0] => a1
[1] => b
[2] => c1
)
......
[1] => Array
(
[0] => a2
[1] => c2
[2] => d3
)
......
)
$arr = array(
array('a1','a2'),
'b',
array('c1','c2'),
array('d1','d2','d3'),
array('e1','e2','e3')
//......省略其它元素(也可以是数组),
);
需先对
$arr = array(
'b',
array('c1','c2'),
array('d1','d2','d3'),
array('e1','e2','e3')
//......省略其它元素(也可以是数组),
);
求 M 取 2 的组合
$c = combination($arr, 2);
然后对组合的结果求笛卡尔积$r = array();
foreach($c as $v)
$r = array_merge($r, Descartes( array('a1','a2'), $v[0], $v[1] ));
print_r($r);
Array
(
[0] => Array
(
[0] => a1
[1] => d1
[2] => e1
) [1] => Array
(
[0] => a1
[1] => d1
[2] => e2
) [2] => Array
(
[0] => a1
[1] => d1
[2] => e3
) [3] => Array
(
[0] => a1
[1] => d2
[2] => e1
) [4] => Array
(
[0] => a1
[1] => d2
[2] => e2
) [5] => Array
(
[0] => a1
[1] => d2
[2] => e3
) [6] => Array
(
[0] => a1
[1] => d3
[2] => e1
) [7] => Array
(
[0] => a1
[1] => d3
[2] => e2
) [8] => Array
(
[0] => a1
[1] => d3
[2] => e3
) [9] => Array
(
[0] => a2
[1] => d1
[2] => e1
) [10] => Array
(
[0] => a2
[1] => d1
[2] => e2
) [11] => Array
(
[0] => a2
[1] => d1
[2] => e3
) [12] => Array
(
[0] => a2
[1] => d2
[2] => e1
) [13] => Array
(
[0] => a2
[1] => d2
[2] => e2
) [14] => Array
(
[0] => a2
[1] => d2
[2] => e3
) [15] => Array
(
[0] => a2
[1] => d3
[2] => e1
) [16] => Array
(
[0] => a2
[1] => d3
[2] => e2
) [17] => Array
(
[0] => a2
[1] => d3
[2] => e3
) [18] => Array
(
[0] => a1
[1] => c1
[2] => e1
) [19] => Array
(
[0] => a1
[1] => c1
[2] => e2
) [20] => Array
(
[0] => a1
[1] => c1
[2] => e3
) [21] => Array
(
[0] => a1
[1] => c2
[2] => e1
) [22] => Array
(
[0] => a1
[1] => c2
[2] => e2
) [23] => Array
(
[0] => a1
[1] => c2
[2] => e3
) [24] => Array
(
[0] => a2
[1] => c1
[2] => e1
) [25] => Array
(
[0] => a2
[1] => c1
[2] => e2
) [26] => Array
(
[0] => a2
[1] => c1
[2] => e3
) [27] => Array
(
[0] => a2
[1] => c2
[2] => e1
) [28] => Array
(
[0] => a2
[1] => c2
[2] => e2
) [29] => Array
(
[0] => a2
[1] => c2
[2] => e3
) [30] => Array
(
[0] => a1
[1] => c1
[2] => d1
) [31] => Array
(
[0] => a1
[1] => c1
[2] => d2
) [32] => Array
(
[0] => a1
[1] => c1
[2] => d3
) [33] => Array
(
[0] => a1
[1] => c2
[2] => d1
) [34] => Array
(
[0] => a1
[1] => c2
[2] => d2
) [35] => Array
(
[0] => a1
[1] => c2
[2] => d3
) [36] => Array
(
[0] => a2
[1] => c1
[2] => d1
) [37] => Array
(
[0] => a2
[1] => c1
[2] => d2
) [38] => Array
(
[0] => a2
[1] => c1
[2] => d3
) [39] => Array
(
[0] => a2
[1] => c2
[2] => d1
) [40] => Array
(
[0] => a2
[1] => c2
[2] => d2
) [41] => Array
(
[0] => a2
[1] => c2
[2] => d3
) [42] => Array
(
[0] => a1
[1] => b
[2] => e1
) [43] => Array
(
[0] => a1
[1] => b
[2] => e2
) [44] => Array
(
[0] => a1
[1] => b
[2] => e3
) [45] => Array
(
[0] => a2
[1] => b
[2] => e1
) [46] => Array
(
[0] => a2
[1] => b
[2] => e2
) [47] => Array
(
[0] => a2
[1] => b
[2] => e3
) [48] => Array
(
[0] => a1
[1] => b
[2] => d1
) [49] => Array
(
[0] => a1
[1] => b
[2] => d2
) [50] => Array
(
[0] => a1
[1] => b
[2] => d3
) [51] => Array
(
[0] => a2
[1] => b
[2] => d1
) [52] => Array
(
[0] => a2
[1] => b
[2] => d2
) [53] => Array
(
[0] => a2
[1] => b
[2] => d3
) [54] => Array
(
[0] => a1
[1] => b
[2] => c1
) [55] => Array
(
[0] => a1
[1] => b
[2] => c2
) [56] => Array
(
[0] => a2
[1] => b
[2] => c1
) [57] => Array
(
[0] => a2
[1] => b
[2] => c2
))
$len = count($arr);
if($num == 0) $num = $len;
$res = array();
for($i=1,$n=pow(2, $len);$i<$n;++$i) {
$tmp = str_pad(base_convert($i, 10, 2), $len, '0', STR_PAD_LEFT);
$t = array();
for($j=0;$j<$len;++$j) {
if($tmp{$j} == '1') {
$t[] = $arr[$j];
}
}
if(count($t) == $num) $res[] = $t;
}
return $res;
}