如何在PHP中获得所有排列,而无需顺序重复?

如何在PHP中获得所有排列,而无需顺序重复?,php,recursion,permutation,combinations,Php,Recursion,Permutation,Combinations,这个问题以多种形式提出。我想在PHP中获取一个数组,并获得所有可能的组合/置换。我想要整个集合和部分集合的置换 我对这个问题的理解是,如何从结果项中删除顺序重复项。通过使用“”并添加一个函数,我接近了我想要的: $words = array('a','b','c'); function permutations($arr,$n) { $res = array(); foreach ($arr as $w) { if ($n==1) $res[] = $w;

这个问题以多种形式提出。我想在PHP中获取一个数组,并获得所有可能的组合/置换。我想要整个集合和部分集合的置换

我对这个问题的理解是,如何从结果项中删除顺序重复项。通过使用“”并添加一个函数,我接近了我想要的:

$words = array('a','b','c');
function permutations($arr,$n)
{
    $res = array();
    foreach ($arr as $w)
    {
        if ($n==1) $res[] = $w;
        else
        {
            $perms = permutations($arr,$n-1);
            foreach ($perms as $p)
            {
                $res[] = $w." ".$p;
            } 
        }
    }
    return $res;
}

function get_all_permutations($words=array())
{
    $r = array();
    for($i=sizeof($words);$i>0;$i--)
    {
        $r = array_merge(permutations($words,$i),$r);
    }
    return $r;
}

$permutations = get_all_permutations($words);
print_r($permutations);
这将产生:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => a a
    [4] => a b
    [5] => a c
    [6] => b a
    [7] => b b
    [8] => b c
    [9] => c a
    [10] => c b
    [11] => c c
    [12] => a a a
    [13] => a a b
    [14] => a a c
    [15] => a b a
    [16] => a b b
    [17] => a b c
    [18] => a c a
    [19] => a c b
    [20] => a c c
    [21] => b a a
    [22] => b a b
    [23] => b a c
    [24] => b b a
    [25] => b b b
    [26] => b b c
    [27] => b c a
    [28] => b c b
    [29] => b c c
    [30] => c a a
    [31] => c a b
    [32] => c a c
    [33] => c b a
    [34] => c b b
    [35] => c b c
    [36] => c c a
    [37] => c c b
    [38] => c c c
)
我知道我可以在生成集合后查看输出,但是在生成过程中是否可以删除顺序重复项

应转换/删除的示例:

  • cc
    c
  • cb
    cb
  • c
    也将与
    c
    相同(如果集合更大)
注:

  • 我不擅长递归,但可能有一种奇特的方法将我拥有的两个函数组合成一个函数
  • 现在,输出集是字符串,但我不介意它们是否是数组(如果这使事情更简单的话)

您可以将置换数组作为置换()的第三个参数传递(带有一个进行中的符号)并在添加值之前运行in_数组()检查。但是,这远不如在get_all_permutation()结束时删除重复项的性能。

您可以将排列数组作为permutations()的第三个参数传递(带有一个进行中的符号)并在添加值之前运行in_array()检查。但是,与在get_all_permutation()末尾删除重复项相比,这种方法的性能要差得多