2016-10-18 9 views
1

配列をとり、配列の配列を返す関数を書くのに苦労しています。これが組み合わされたもの、順列、または何か他のものとみなされるかどうかはわかりません。結果は、私が実際に実装したものと同じではありませんが、まったく同じではありません。PHPで変更されたコンビネーション/置換アルゴリズム

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

このような配列の配列を返す必要があります:

のは、関数のシグネチャがあるとしましょう。そして、このコードは

function variable_length_permutations_with_duplicates($set_array, $max_subset_length)

のようなものです

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

値は何でもかまいませんので、配列を操作する必要があります。その例のような文字列である必要はありません。戻り配列内のサブセットは、特定の順序で表示する必要はありません。

これに使用できるPHP関数またはクラス、またはPHPに変換できる別の言語のリファレンス実装について知っていますか?

答えて

2

あなたはこのコードを使用することができます - 私は、関数名を少し短く:)行わ:このロジックでは、また、空の配列が結果に含まれていること

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] : []; 
+0

うわー、あなたは私の心を読んで、私が実際に必要なものを考え出し、およびコードを提供しました。よくやった。私が意味するのは、含まれている空のセットが良いことであることが判明したということです。このコードはユニットテストにも完全に対応しています。 –

関連する問題