2

この質問は、さまざまな形で尋ねられてきました。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
)

セットが生成されたら、出力を確認できることはわかっていますが、生成中に連続した重複を削除することは可能ですか?

変換/削除する必要がある例:

  • c c cと同じだろうc
  • c c bと同じだろうc b
  • c c c c cも同じcです(セットが大きい場合)

ノート:

  • 私は再帰が得意ではありませんが、おそらく、私が持っている 2 つの関数を 1 つに結合する素晴らしい方法があるでしょう。
  • 現在、出力セットは文字列ですが、代わりに配列であるかどうかは気にしません (それが作業を容易にする場合)
4

1 に答える 1

0

順列配列を参照として(アンパサンドが続く)、permutations()の3番目のパラメーターとして渡し、値を追加する前にin_array()チェックを実行できます。ただし、これはget_all_permutation()の最後で重複を削除するよりもはるかにパフォーマンスが低くなります。

于 2012-09-02T18:41:33.023 に答える