これは、あなたの質問に対する大幅に更新された回答です(最初はこの回答から更新されました] 1):
function findPermutations($arr, $arrLen, $size, $perArr = array(), $pos = 0, &$found = array()) {
if ($size==$pos) { //if $pos reach $size then we have found one permutation
$found[] = vsprintf("%s%s|%s%s|%s%s", $perArr);
return;
}
for ($i=0; $i<$arrLen; $i++) {
$perArr[$pos] = $arr[$i]; //put i'th char in current position
//The recursive call that move to next position with $pos+1
findPermutations($arr, $arrLen, $size, $perArr, $pos+1, $found);
}
return $found;
}
$permutations = array();
$letters = array('1','2','3');
$max_length = 6;
$permutations = findPermutations($letters, count($letters), $max_length);
for($i = 0; $i < count($permutations); $i++) {
print ($permutations[$i].'<br/>');
}
これが私がやっていることです。参照によって呼び出される空の配列を渡し、$permutations
新しい順列を見つけたら、それらを追加します。関数findPermutations()
が完了すると、反復または挿入できるすべての順列の配列が得られます。vsprintfを使用しているフォーマットを取得するために、データの配列を渡してフォーマットを適用できます (この場合は%s%s|%s%s|%s%s
)。最後に、デフォルトの引数値を使用して、この関数の呼び出しをよりクリーンにしています。