PHP中的改变组合/排列算法


Altered Combinations/Permutations Algorithm in PHP

我很难写一个函数,它接受一个数组并返回一个数组的数组。我不确定这是否会被视为组合、排列或其他东西。结果应该与我见过实现的其他一些排列和组合算法相似,但不完全相同。

假设函数签名是

function variable_length_permutations_with_duplicates($set_array, $max_subset_length)

那么下面的代码:

$sets = variable_length_permutations_with_duplicates(array('a', 'b'), 2);

应该返回这样一个数组的数组:

[ ['a'], ['a','a'], ['a','b'], ['b], ['b','b'], ['b','a'], ]

它确实需要处理数组,因为值可以是任何东西,它们不一定是字符串,就像那个例子一样。返回数组中的子集不需要以任何特定的顺序出现。

你知道任何PHP函数或类,我可以使用或参考实现的另一种语言,我可以翻译成PHP?

您可以使用以下代码——我将函数名称缩短了一点:):

function perm($set_array, $max_subset_length, $prefix = []) {
    $result = [$prefix];
    if ($max_subset_length) {
        foreach ($set_array as $el) {
            $result = array_merge($result, 
                perm($set_array, $max_subset_length-1, array_merge($prefix, [$el])));
        }
    }
    return $result;
}
$sets = perm(array('a', 'b'), 2);   
print_r($sets);

注意,在这个逻辑中,空数组也包含在结果中。使用if,您可以在函数的第一行中排除以下内容:

    $result = count($prefix) ? [$prefix] : [];