Шаффле PHP shuffle()
не рандомизирует массив так, как мне это нужно. У меня есть двумерный массив, и когда я использую shuffle()
он только рандомизирует 2-мерное измерение массива, но мне нужно обратное.
Предположим, что это массив, который мне нужно перетасовать:
Array ( [0] => Array ( [key1] => 199 [key2] => 6 ) [1] => Array ( [key1] => 195 [key2] => 3 ) )
Способ shuffle()
в shuffle()
:
Array ( [0] => Array ( [key1] => 195 [key2] => 3 ) [1] => Array ( [key1] => 199 [key2] => 6 ) )
Но это не то, что мне нужно. В конечном итоге мне нужно:
Array ( [1] => Array ( [key1] => 195 [key2] => 6 ) [0] => Array ( [key1] => 199 [key2] => 6 ) )
Я знаю, что это может быть достигнуто с использованием случайного ключа с rand()
или mt_rand()
, но также возможно, что для небольшого количества ключей мы могли бы получить один и тот же ключ rand()
дважды, что приведет к НЕ хорошо перемешанный массив.
Я также знаю, что добавление больше, if else
логика была бы возможна, но я хочу сделать это с уже реализованным материалом – я не хочу изобретать велосипед.
Как я могу достичь желаемого тасования?
shuffle()
работает по назначению. Это не «рандомизация второго измерения», оно не рекурсивно.
Он переупорядочивает элементы массива (которые просто становятся массивами). Проблема, которую вы видите, заключается в том, что shuffle()
сбрасывает ключи массива.
Из документов ( http://php.net/shuffle ):
Примечание . Эта функция назначает новые ключи элементам в массиве. Он удалит все существующие ключи, которые могут быть назначены, а не просто переупорядочить ключи.
Чтобы получить то, что вы хотите, вам нужно использовать array_rand()
для рандомизации ключей, а затем изменить порядок элементов в массиве на основе этого.
$randKeys = array_rand($array, count($array)); // This is needed because array_rand was changed // and now returns the keys in order shuffle($randKeys); uksort($array, function($a, $b) use($randKeys){ return array_search($a, $randKeys) - array_search($b, $randKeys); });
ДЕМО: https://eval.in/101265
В разделе комментариев руководства PHP для перетасовки вы найдете:
<?php function shuffle_assoc(&$array) { $keys = array_keys($array); shuffle($keys); foreach($keys as $key) { $new[$key] = $array[$key]; } $array = $new; return true; } ?>
$yourArray = array( array('key1' => 199, 'key2' => 6), array('key1' => 195, 'key2' => 3), array('key1' => 205, 'key2' => 8) ); $helperArr = array(); foreach($yourArray as $subArr) { foreach($subArr as $key => $value) $helperArr[$key][] = $value; } foreach($helperArr as &$shuffleArr) shuffle($shuffleArr); $shuffledArr = array(); foreach($helperArr as $key => $value) { for($i = 0; $i < count($value); $i++) $shuffledArr[$i][$key] = $value[$i]; } echo '<pre>'; print_r($helperArr); print_r($shuffledArr); echo '</pre>';
DEMO