Display possible combinations of string

前端 未结 3 1417
谎友^
谎友^ 2020-11-28 13:54

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 arra

相关标签:
3条回答
  • 2020-11-28 14:37

    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 
    
    0 讨论(0)
  • 2020-11-28 14:49

    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 讨论(0)
  • 2020-11-28 14:54

    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
    
    0 讨论(0)
提交回复
热议问题