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

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

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

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

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

 shuffle($animals); 

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

Solutions Collecting From Web of "PHP – перетасовать только часть массива"

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

 $ sub = array_splice ($ animals, 7, 2);
 перетасовка ($ суб);
 array_splice ($ animals, 7,0, $ sub);
 var_dump ($ животных);
 $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; } 

Добавление 2 вариаций алгоритма несвязанного перетасовки 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 использует вариацию алгоритма перетасовки Fisher-Yates-Knuth

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

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

  1. Эффективно выбирайте n случайных элементов из массива PHP (без перетасовки)