【问题标题】:Generate all combinations of an array with a given number of slots in PHP在 PHP 中生成具有给定槽数的数组的所有组合
【发布时间】:2013-09-01 14:46:42
【问题描述】:

我已经编写了下面的函数,它接受一个数组并输出它的所有组合。

$option = array("a","b","c");

function combinations($array, $number) {
    if ($number == 1) {
        foreach ($array as $k => $v1) {
            echo $v1 . "<br>";
        }
    } elseif ($number == 2) {
        foreach ($array as $k => $v1) {
            foreach ($array as $key => $v2) {
                echo $v1 . " - " . $v2 . "<br>";
            }

        }
    } elseif ($number == 3) {
        foreach ($array as $k => $v1) {
            foreach ($array as $key => $v2) {
                foreach ($array as $key => $v3) {
                    echo $v1 . " - " . $v2 . " - " . $v3 . "<br>";
                }
            }
        }
    }
}

combinations($option, 2);

输出是:

a - a
a - b
a - c
b - a
b - b
b - c
c - a
c - b
c - c

它接受一个数字作为参数,并为组合返回 1、2 或 3 个插槽。但是,我提前不知道组合会有多少个插槽。大多数时候它可能在 1 到 3 之间,但我希望有一种方法可以重写它,以便它可以处理任意数量的插槽。

我是 PHP 新手,所以我确信我缺少一些简单的东西。如果有人能指出正确的方向,我将不胜感激。

更新:

我不确定这是php string permutation 的副本。如果我正确理解他们的问题,他们正在寻求进行 4 插槽组合。我可以使用函数中的另一个 elseif 块来完成此操作。我正在寻找一种方法来使这项工作适用于任意数量的插槽。如果我误解了,我深表歉意。

【问题讨论】:

    标签: php arrays function combinations


    【解决方案1】:
    $option = array("a", "b");
    
    function combinations($option, $number) {
        $combo = array_fill(0, $number, 0);
        $num_option = count($option);
    
        while (true) {
            // output the combination
            $output = array_fill(0, $number, 0);
            for ($i = 0; $i < $number; ++$i) {
                $output[$i] = $option[$combo[$i]];
            }
            echo implode(" - ", array_reverse($output)) . "<br>";
    
            // compute next combination
            $incpos = 0;
            while ($combo[$incpos] == $num_option-1) {
                $combo[$incpos++] = 0;
                if ($incpos >= $number) {
                    // we wrapped around - end
                    return;
                }
            }
            ++$combo[$incpos];
        }
    }
    
    combinations($option, 5);
    

    此代码通过将当前组合视为带有$number 数字的基数N 数,其中N 是$option 数组中的值的数量。在每次迭代中,写出与数字匹配的组合,然后将数字加一。当基数为 N 的数回绕回零时,循环终止。

    结果:

    a - a - a - a - a
    a - a - a - a - b
    a - a - a - b - a
    a - a - a - b - b
    a - a - b - a - a
    a - a - b - a - b
    a - a - b - b - a
    a - a - b - b - b
    a - b - a - a - a
    a - b - a - a - b
    a - b - a - b - a
    a - b - a - b - b
    a - b - b - a - a
    a - b - b - a - b
    a - b - b - b - a
    a - b - b - b - b
    b - a - a - a - a
    b - a - a - a - b
    b - a - a - b - a
    b - a - a - b - b
    b - a - b - a - a
    b - a - b - a - b
    b - a - b - b - a
    b - a - b - b - b
    b - b - a - a - a
    b - b - a - a - b
    b - b - a - b - a
    b - b - a - b - b
    b - b - b - a - a
    b - b - b - a - b
    b - b - b - b - a
    b - b - b - b - b
    

    【讨论】:

    • 您先生是个巫师!非常感谢!
    猜你喜欢
    • 2013-07-30
    • 2018-06-06
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多