之前我写过一篇关于笛卡尔积的2个版本的PHP实现,在网上看到一篇结合PHP数组函数和递归实现的版本。代码如下:
<?php
$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"][] = implode("", $tmp);
}
array_pop($tmp);
}
}
?>
下图是我对该版本算法运行的简易流程图:
说妙用是因为,利用array_shift
实现数组的剔除,来实现遍历,另一个妙用array_pop
实现数组的弹出,避免在递归中出现的重复值。