从数组生成排列


Generating permutations from arrays

我试图将一个从这个答案生成排列的函数移植到PHP,结果如下:

function recurse($s, $arrs, $k) {
    if ($k === count($arrs)) {
        echo $s.' ';
    } else {
        foreach ($arrs[$k] as $o) {
            recurse($s.$o, $arrs, $k + 1);
        }
    }
}

这给了我正确的输出

137 138 147 148 237 247 248

现在我想把输出作为一个数组,而不是字符串,但在编辑之后,由于某种原因,我得到了错误的结果:

function generatePermutations($s, $arrs, $k) {
    if ($k === count($arrs)) {
        print_r($s);
    } else {
        foreach ($arrs[$k] as $o) {
            $s[] = $o;
            generatePermutations($s, $arrs, $k + 1);
        }
    }
}

输出:

阵列([0]=>1[1] =>3[2] =>7)大堆([0]=>1[1] =>3[2] =>7[3] =>8)大堆([0]=>1[1] =>3[2] =>4[3] =>7)大堆([0]=>1[1] =>3[2] =>4[3] =>7[4] =>8)大堆([0]=>1[1] =>2[2] =>3[3] =>7)大堆([0]=>1[1] =>2[2] =>3[3] =>7[4] =>8)大堆([0]=>1[1] =>2[2] =>3[3] =>4[4] =>7)大堆([0]=>1[1] =>2[2] =>3[3] =>4[4] =>7[5] =>8)

这是两个功能的输入

$in = array( array(1, 2), array(3, 4), array(7, 8) );
recurse("", $in, 0);
generatePermutations(array(), $in, 0);

我做错了什么?

如果使用$s[]=$o;在递归函数中,它会为每个数字对数组进行切片。您可以添加一个"result"参数,它将把您的结果集保存为一个数组。注意&符号。没有它,参数就不是"可写的",只有"可读的"。

$in = array( array(1, 2), array(3, 4), array(7, 8) );
$result = array();
generatePermutations("", $in, 0, $result);
print_r($result);
function generatePermutations($s, $arrs, $k, &$result) {
    if ($k === count($arrs)) {
        $result[] = $s; 
    } else {
        foreach ($arrs[$k] as $o) {
            generatePermutations($s.$o, $arrs, $k + 1, $result);
        }   
    }   
}

输出:

Array
(
    [0] => 137
    [1] => 138
    [2] => 147
    [3] => 148
    [4] => 237
    [5] => 238
    [6] => 247
    [7] => 248
)

编辑:修改以获得Robotex的预期输出:

$in = array( array(1, 2), array(3, 4), array(7, 8) );
$result = array();
$s = array();
generatePermutations($s, $in, 0, $result);
print_r($result);
function generatePermutations(&$s, $arrs, $k, &$result) {
    if ($k === count($arrs)) {
        array_push($result, $s);
    } else {
        foreach ($arrs[$k] as $o) {
            array_push($s, $o);
            generatePermutations($s, $arrs, $k + 1, $result);
            array_pop($s);
        }   
    }   
}

输出:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 7
        )
    [1] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 8
        )
    [2] => Array
        (
            [0] => 1
            [1] => 4
            [2] => 7
        )
    [3] => Array
        (
            [0] => 1
            [1] => 4
            [2] => 8
        )
    [4] => Array
        (
            [0] => 2
            [1] => 3
            [2] => 7
        )
    [5] => Array
        (
            [0] => 2
            [1] => 3
            [2] => 8
        )
    [6] => Array
        (
            [0] => 2
            [1] => 4
            [2] => 7
        )
    [7] => Array
        (
            [0] => 2
            [1] => 4
            [2] => 8
        )
)