I know this is a very old post, but the other answer isn't very flexible, so I thought I would bring a new answer in.
Explanation
So you are looking for all combinations which would be:
(2n) - 1
Which in your specific example would be:
(23) - 1 = (8) - 1 = 7
So how do I get all combinations now? We loop through all our combinations, which we already have(Starting off with one combination, an "empty combination" ($results = [[]];
)), and for each combination we go through our next word from the array and combine each combination with each new word to a new combination.
Example
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
So as you can see there is always: (2^n)-1
combinations in total. Also from this method there is an empty array left in the combination array, so before I return the array I just use array_filter()
to remove all empty arrays and array_values()
to reindex the entire array.
Code
<?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 />";
?>
output:
how
are
how are
you
how you
are you
how are you