この質問は、さまざまな形で尋ねられてきました。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 つに結合する素晴らしい方法があるでしょう。
- 現在、出力セットは文字列ですが、代わりに配列であるかどうかは気にしません (それが作業を容易にする場合)