递归实现
$arr = array(
array(1),
array(2,3),
array(4,5,6)
);
fun($arr);
print_r($res);
function fun($arr, $tmp = array())
{
foreach(array_shift($arr) AS $v)
{
$tmp[] = $v;
if($arr)
{
fun($arr, $tmp);
}
else
{
$GLOBALS["res"][] = $tmp;
}
array_pop($tmp);
}
}
foreach,遍历每个元素元素,进行递归。
如:
1,2 4 5 6 => 1,2,4 1,2,5 1,2,6
1,3 4 5 6 => 1,3,4 1,3,5 1,3,6
举例:
$arr = array(
'a'=>array('a1','a2','a3'),
'b'=>array('b1','b2','b3'),
'c'=>array('c1','c2','c3'),
//..........多行......
);
fun($arr);
//print_r($res);
echo '<table width="150px" border="1">';
$j=0;
echo "<tr>";
echo "<td>序号</td>";
foreach($arr as $k=>$v)
{
echo "<td>".$k."</td>";
}
echo "</tr>";
foreach($res as $v)
{
echo "<tr>";
$i=0;
$j++;
echo "<td>".$j."</td>";
foreach($arr as $value)
{
echo "<td>".$v[$i]."</td>";
$i++;
}
echo "</tr>";
}
echo '</table>';
function fun($arr, $tmp = array())
{
foreach(array_shift($arr) AS $v)
{
$tmp[] = $v;
if($arr)
{
fun($arr, $tmp);
}
else
{
$GLOBALS["res"][] = $tmp;
}
array_pop($tmp);
}
}
exit;
非递归:(其实也类似递归)
$arr = array(
array('a1','a2',),
array('c1','c2',),
array('d1','d2','d3'),
//......省略其它元素(也可以是数组),
);
$r = Descartes( $arr );
print_r($r);
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;
}
exit;