显示可能的string组合
我想要一个string,并显示它的可能组合(在PHP中),但是按照每个字的顺序。 例如:“你好吗”会返回(一个数组)
How are you How are are you how you are
我现在的代码显示所有的组合,但我希望它保持秩序,而不是翻转单词。 任何人有任何想法或片段,他们都喜欢分享? 谢谢
设置两个迭代器并在它们之间打印所有内容。 所以像这样的东西:
<? $str = "How are you"; $words = explode(" ",$str); $num_words = count($words); for ($i = 0; $i < $num_words; $i++) { for ($j = $i; $j < $num_words; $j++) { for ($k = $i; $k <= $j; $k++) { print $words[$k] . " "; } print "\n"; } } ?>
产量
How How are How are you are are you you
我知道这是一个很老的post,但是另一个答案不是很灵活,所以我想我会带来一个新的答案。
说明
所以你正在寻找所有的组合,这将是:
(2 n ) – 1
在你的具体例子中是:
(2 3 )-1 =(8)-1 = 7
那么我现在怎么得到所有的组合呢? 我们通过我们已经拥有的所有组合循环(以一个组合开始,一个“空组合”( $results = [[]];
)),并且对于每个组合,我们遍历数组中的下一个单词并合并每个新词的每个组合都有一个新的组合。
例
Array with the words/numbers (Empty array is '[]'): [1, 2, 3]
//↓new combinations for the next iteration │ iteration 0: Combinations: - [] │ -> [] │ iteration 1: ┌─────────────┤ │ │ Combinations: vv - [] + 1 │ -> [1] │ iteration 2: ┌─────────────┤ │ │ Combinations: vv - [] + 2 │ -> [2] - [1] + 2 │ -> [1,2] │ iteration 3: ┌─────────────┤ │ │ Combinations: vv - [] + 3 │ -> [3] - [1] + 3 │ -> [1,3] - [2] + 3 │ -> [2,3] - [1,2] + 3 │ -> [1,2,3] //^ All combinations here
所以你可以看到总是有(2^n)-1
组合。 同样从这个方法有一个空数组留在组合数组,所以在我返回数组之前,我只是使用array_filter()
删除所有空数组和array_values()
重新索引整个数组。
码
<?php $str = "how are you"; function getCombinations($array) { //initalize array $results = [[]]; //get all combinations foreach ($array as $k => $element) { foreach ($results as $combination) $results[] = $combination + [$k => $element]; } //return filtered array return array_values(array_filter($results)); } $arr = getCombinations(explode(" ", $str)); foreach($arr as $v) echo implode(" ", $v) . "<br />"; ?>
输出:
how are how are you how you are you how are you
回答问题PHP数组组合与退出顺序 。 那里有必要获得所有可能的数组元素的组合,并存储以下内容。
<?php $alphabet = array('a','b','c'); $result = array(); $arrResult = array(); // recursively create all possible combinations { combine($alphabet, $result, $arrResult); function combine($shiftedAlphabet, &$result, &$arrResult) { global $alphabet; $currentElementStr = ''; $currentElementArr = array(); for($i = 0; $i < count($shiftedAlphabet); ++$i) { $newElement = $shiftedAlphabet[$i]; $currentElementStr .= $newElement; $currentElementArr[] = $newElement; if(!in_array($currentElementStr, $result)) { // if not duplicated => push it to result // find right position { $thisCount = count($currentElementArr); $indexFrom = 0; $indexToInsert = 0; // find range of indexes with current count of elements { foreach ($arrResult as $arrResultKey => $arrResultValue) { $indexToInsert = $arrResultKey + 1; if ($thisCount > count($arrResultValue)) { $indexFrom = $indexToInsert; } if ($thisCount < count($arrResultValue)) { --$indexToInsert; break; } } // find range of indexes with current count of elements } // find true index inside true range { $trueIndex = $indexToInsert; $break = false; for($j = $indexFrom; $j < $indexToInsert; ++$j) { $trueIndex = $j + 1; foreach($arrResult[$j] as $key => $value) { if (array_search($value, $alphabet) > array_search($currentElementArr[$key], $alphabet)) { $break = true; break; } } if($break) { --$trueIndex; break; } } // find true index inside true range } array_splice($result, $trueIndex, 0, $currentElementStr); array_splice($arrResult, $trueIndex, 0, array($currentElementArr)); } } for($i = 0; $i < count($shiftedAlphabet) - 1; ++$i) { $tmpShiftedAlphabet = $shiftedAlphabet; // for combining all possible subcombinations array_splice($tmpShiftedAlphabet, $i, 1); combine($tmpShiftedAlphabet, $result, $arrResult); } } // recursively create all possible combinations } var_dump($result); ?>
这里的例子结果