之前我写过一篇关于笛卡尔积的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);
    }
}

?>

下图是我对该版本算法运行的简易流程图:

flow.png - 大小: 10.42 KB - 尺寸:  x  - 点击打开新窗口浏览全图

说妙用是因为,利用array_shift实现数组的剔除,来实现遍历,另一个妙用array_pop实现数组的弹出,避免在递归中出现的重复值。