Отображение возможных комбинаций строк

Я пытаюсь взять строку и отобразить возможные комбинации ее (в 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 

Я знаю, что это очень старый пост, но другой ответ не очень гибкий, поэтому я подумал, что принесу новый ответ.

объяснение

Таким образом, вы ищете все комбинации, которые будут:

(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); ?> 

Пример результата здесь