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

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

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

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

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

shuffle($animals);

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

2

Решение

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

$ sub = array_splice ($ animals, 7, 2);
перетасовка ($ суб);
array_splice ($ animals, 7,0, $ sub);
var_dump ($ животных);
4

Другие решения

Добавление 2 вариаций Алгоритм беспристрастного перетасовки Фишера-Йейтса-Кнута, только включенные индексы или исключенные индексы (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

НОТА Эта функция shuffle в PHP сама использует разновидность алгоритма перемешивания Фишера-Йейтса-Кнута

ЗАМЕТКА 2 Все приведенные алгоритмы перемешивания (и исходная функция PHP перемешивания) имеют (среднюю) временную сложность $ O (n) $ (n = размер массива для перемешивания)

для других вариаций shuffle увидеть:

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

$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
По вопросам рекламы [email protected]