これが効率的または最適であると主張しているわけでは決してありません。そこにはもっと良い解決策があります。しかし、これはあなたの質問に対する直接的な答えです。肥大化を取り除きたい場合は (少しパフォーマンスが低下する可能性があります)、getRemainingWords
関数呼び出しを次のように置き換えることができます。
$index = 0;
array_values(array_filter($words, function($key, &$index) { return !($key == $index++); }));
それ以外の場合は、ここにあります
function getPossibleCombinations($words) {
$combinations = array();
$count = count($words);
// Base case: if there's only 1 word, there's only one combination
if ($count == 1) {
return array($words);
}
// Otherwise, loop over each words
foreach ($words as $key=>$word) {
// For each item, get all of the remaining items in the array (all except the current one)
$otherWords = getRemainingWords($words, $key);
// And recursively permute them
$otherCombinations = getPossibleCombinations($otherWords);
foreach ($otherCombinations as $otherCombination) {
$combinations[] = array_merge(array($word), $otherCombination);
}
}
return $combinations;
}
function getRemainingWords($array, $index) {
$results = array();
foreach ($array as $key=>$value) {
if ($key == $index) {
continue;
}
$results[] = $value;
}
return $results;
}