PHP - shuffle only part of an array

后端 未结 4 1133
无人及你
无人及你 2020-12-07 04:41

I have an array as so:

$animals = array (
    \'giraffe\',
    \'lion\',
    \'hippo\',
    \'dog\',
    \'cat\',
    \'rabbit\',
    \'fly\',
    \'hamster\         


        
相关标签:
4条回答
  • 2020-12-07 05:00
    $animals = array (
    'giraffe',
    'lion',
    'hippo',
    'dog',
    'cat',
    'rabbit',
    'fly',
    'goldfish'
    );
    $other = array('hamster','gerbil');
    $allAnimals = array();
    foreach($animals as $key => $animal){
        if($key == 7){
            $allAnimals = array_merge($allAnimals,shuffle($other));
        }
    $allAnimals[] = $animal;
    }
    
    0 讨论(0)
  • 2020-12-07 05:04

    You can splice the array for those to elements, randomize their order and put them back in the original array:

    $sub = array_splice($animals, 7, 2);
    shuffle($sub);
    array_splice($animals, 7,0, $sub);
    var_dump($animals);
    
    0 讨论(0)
  • 2020-12-07 05:14

    Adding 2 variations of Fisher-Yates-Knuth unbiased shuffling algorithm, with only included indices or excluded indices (php-like pseudo-code)

    function shuffle_include( $a, $inc ) 
    {
        // $a is array to shuffle
        // $inc is array of indices to be included only in the shuffle
        // all other elements/indices will remain unaltered
    
        // fisher-yates-knuth shuffle variation O(n)
        $N = count($inc);
        while ( $N-- )
        { 
            $perm = rnd( 0, $N ); 
            $swap = $a[ $inc[$N] ]; 
            $a[ $inc[$N] ] = a[ $inc[$perm] ]; 
            $a[ $inc[$perm] ] = $swap; 
        }
        // in-place
        return $a;
    }
    
    function shuffle_exclude( $a, $exc ) 
    {
        // $a is array to shuffle
        // $exc is array of indices to be excluded from the shuffle
        // all other elements/indices will be shuffled
        // assumed excluded indices are given in ascending order
        $inc = array();
        $i=0; $j=0; $l = count($a); $le = count($exc)
        while ($i < $l)
        {
            if ($j >= $le || $i<$exc[$j]) $inc[] = $i;
            else $j++;
            $i++;
        }
        // rest is same as shuffle_include function above
    
        // fisher-yates-knuth shuffle variation O(n)
        $N = count($inc);
        while ( $N-- )
        { 
            $perm = rnd( 0, $N ); 
            $swap = $a[ $inc[$N] ]; 
            $a[ $inc[$N] ] = $a[ $inc[$perm] ]; 
            $a[ $inc[$perm] ] = $swap; 
        }
        // in-place
        return $a;
    }
    

    Example:

    $a = array(1,2,3,4,5,6);
    
    print_r( shuffle_include( $a, array(0,1,2) ) );
    // sample output: [2,1,3,4,5,6] , only 0,1,2 indices are shuffled
    
    print_r( shuffle_exclude( $a, array(0,1,2) ) );
    // sample output: [1,2,3,6,5,4], all other indices are shuffled except 0,1,2
    

    NOTE That PHP's shuffle function itself uses a variation of Fisher-Yates-Knuth shuffling algorithm

    NOTE2 All shuffle algorithms given (and PHP's original shuffle function) have a (average) time complexity of $O(n)$ (n=size of array to shuffle)

    for other variations of shuffle see:

    1. Efficiently pick n random elements from PHP array (without shuffle)
    0 讨论(0)
  • 2020-12-07 05:15
    function shuffle_include($a, $include_indexes)    
    {    
        $b = array();    
        foreach ($include_indexes as $i => $v)    
            $b[] = $a[$v];    
                
        shuffle($b);    
        
        foreach ($include_indexes as $i => $v)    
            $a[$v] = $b[$i];    
         
        return $a;    
    }
    

    Example:

    $animals = array (
    'giraffe',
    'lion',
    'hippo',
    'dog',
    'cat',
    'rabbit',
    'fly',
    'hamster',
    'gerbil',
    'goldfish');
    
    $new_animals = shuffle_include($animals, array(7,8));
    
    0 讨论(0)
提交回复
热议问题