PHP - перетасовать только часть массива - arrays


1

У меня есть массив:

$animals = array (
    giraffe,
    lion,
    hippo,
    dog,
    cat,
    rabbit,
    fly,
    hamster,
    gerbil
    goldfish
);

Это порядок, в котором я хочу, чтобы массив находился отдельно от этих 2 - hamster и gerbil

Я хотел бы рандомизировать между тем, что происходит первым. Я знаю, что могу использовать:

shuffle($animals);

Чтобы ранжировать их все, но я хочу сделать это только для этих 2. Так что, если бы я должен был сделать print_r($animals), я мог бы получить хомяка перед песчаной, но в другой раз получить gerbil до хомяка

  •  14
  •  3
  • 8 фев 2020 2020-02-08 08:05:42

3 ответа

0

Добавление двух вариаций алгоритм несмещенного перетасовки Fisher-Yates-Knuth, включающий только индексы или исключенные индексы (php-подобный псевдокод )

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;
}

Пример:

$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

ПРИМЕЧАНИЕ. Эта функция PHP shuffle использует вариацию алгоритма перетасовки Fisher-Yates-Knuth

ПРИМЕЧАНИЕ2. Все алгоритмы в случайном порядке (и оригинальная функция перетасовки PHP) имеют (среднюю) временную сложность $O (n) $(n = размер массива для перетасовки)

для других вариантов shuffle см.:

  • 8 фев 2020 2020-02-08 08:05:44
0
$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;
}
  • 8 фев 2020 2020-02-08 08:05:43
4

Вы можете splice использовать массив для элементов, рандомизировать их порядок и вернуть их в исходный массив:

$sub = array_splice($animals, 7, 2);
shuffle($sub);
array_splice($animals, 7,0, $sub);
var_dump($animals);
  • 8 фев 2020 2020-02-08 08:05:43