Я знаю, что это очень старый пост, но другой ответ не очень гибок, поэтому я подумал, что смогу принести новый ответ.
Объяснение
Итак, вы ищете все комбинации, которые были бы:
(2 n ) - 1
Что в вашем конкретном примере будет:
(2 3 ) - 1 = (8) - 1 = 7
Так как мне получить все комбинации сейчас? Мы перебираем все наши комбинации, которые у нас уже есть (начиная с одной комбинации, «пустой комбинации» ($results = [[]];
)), и для каждой комбинации мы проходим наше следующее слово из массива и объединяем каждую комбинацию с каждой новой слово для новой комбинации.
* * Пример тысячи двадцать-шести * 1 028 *
Array with the words/numbers (Empty array is '[]'):
[1, 2, 3]
//↓new combinations for the next iteration
│
iteration 0:
Combinations:
- [] │ -> []
│
iteration 1: ┌─────────────┤
│ │
Combinations: v v
- [] + 1 │ -> [1]
│
iteration 2: ┌─────────────┤
│ │
Combinations: v v
- [] + 2 │ -> [2]
- [1] + 2 │ -> [1,2]
│
iteration 3: ┌─────────────┤
│ │
Combinations: v v
- [] + 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