Get ALL possible results from mixing array

后端 未结 3 613
独厮守ぢ
独厮守ぢ 2021-01-13 02:01

I\'ve looked everywhere for this online, but couldn\'t completely find it. (my PHP and math skills are letting my down for this one...) I have an array containing for exampl

3条回答
  •  [愿得一人]
    2021-01-13 02:27

    There's an example function for permutations on O'Reilly's PHP Cookbook, section 4.26. It only creates permutations of a fixed size, but can be used in a loop to deal with any size like you need it.

    Code

    function pc_next_permutation($p, $size) {
        // slide down the array looking for where we're smaller than the next guy
        for ($i = $size - 1; $p[$i] >= $p[$i+1]; --$i) { }
    
        // if this doesn't occur, we've finished our permutations
        // the array is reversed: (1, 2, 3, 4) => (4, 3, 2, 1)
        if ($i == -1) { return false; }
    
        // slide down the array looking for a bigger number than what we found before
        for ($j = $size; $p[$j] <= $p[$i]; --$j) { }
    
        // swap them
        $tmp = $p[$i]; $p[$i] = $p[$j]; $p[$j] = $tmp;
    
        // now reverse the elements in between by swapping the ends
        for (++$i, $j = $size; $i < $j; ++$i, --$j) {
             $tmp = $p[$i]; $p[$i] = $p[$j]; $p[$j] = $tmp;
        }
        return $p;
    }
    
    $set = explode(' ', 'a b c');
    
    // $all will contain the final output
    $all = $set;
    while(count($set) > 1) {
        $perms = array();
        $size = count($set) - 1;
        $perm = range(0, $size);
        $j = 0;
    
        do { 
             foreach ($perm as $i) { $perms[$j][] = $set[$i]; }
        } while ($perm = pc_next_permutation($perm, $size) and ++$j);
    
        foreach ($perms as $p) {
             $all[] = implode(' ', $p);
        }
        array_pop($set);    
    }
    
    // display results
    foreach($all as $each) {
        echo $each . "\n";
    }
    

    Output

    a
    b
    c
    a b c
    a c b
    b a c
    b c a
    c a b
    c b a
    a b
    b a
    

    Live example

提交回复
热议问题