开发者

Display possible combinations of string

I am trying to take a string and display the possible combinations of it (in PHP), but while saying in order of each word. For example: "how are you" would return (an array)

How are you
How are
are you
how
you
are

The code I have now displays all combinations but I am wanting it to keep them in order and not flip words. Any one have any ideas or snipp开发者_开发技巧ets they care to share? Thanks


Set two iterators and print everything between them. So something like this:

<?
$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";
  }
}
?>

Output


How 
How are 
How are you 
are 
are you 
you 


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


Answer for question PHP array combination with out back order. There it was necessary to obtain all possible combinations of array elements and store the following.

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

?>

Example result here

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜