我怎样才能在PHP中所有的排列顺序不重复?(How can I get all permutatio

2019-09-22 02:34发布

这个问题已经被问许多形式。 我想在PHP中的数组,并得到所有可能的组合/排列。 我希望整个组的两个置换以及部分集。

我在这个问题上的扭曲是问我如何从结果项中删除重复的顺序。 我接近了我想要的东西,通过使用“ 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
)

我知道我可以期待通过一次输出一组已经产生,但有可能产生过程中去除重复的顺序?

实施例应被变换/删除:

  • ccc是一样c
  • ccb将同cb
  • ccccc也将是相同c (如果设定为大)

笔记:

  • 我不是伟大的递归,但有可能是这两个函数我有合并成一个奇特的方式。
  • 眼下输出设置都是字符串,但如果他们是数组来代替我不介意(如果让事情变得更简单)

Answer 1:

你可以通过排列阵列作为参考在作为排列的第三参数(具有在进行和号)()并运行一个in_array()将值相加之前检查。 然而,这将是远远大于在get_all_permutation的端删除重复更少高性能()



文章来源: How can I get all permutations in PHP without sequential duplicates?