Intereting Posts
Как создать собственный DataProvider в Yii с помощью CDataProvider? php-переменная в html нет другого пути: <? php echo $ var; ?> Скрипт для выполнения команды для всех файлов в папке Проверьте, является ли строка временной отметкой unix Запрос AJAX не работает при передаче строки Кто-нибудь успешно использовал jonnyw's php phantomjs с laravel, в ubuntu envirement? Работа с JSON и многомерным массивом (JS) Навигация по php-страницам по серийному номеру Как динамически создавать объекты в PHP? Основы PHP – Где хранить пароль MySQL, используемый PHP PHP: подсчитать одинаковые значения в многомерном массиве Значение переменной PHP String to Int Conversion (с помощью simple_html_dom) Отправка значения на страницу с помощью AJAX, действие формы не работает Как обнаружить, что пользователи открывают мое приложение Facebook в iframe или прямое URL-адрес setcookie, Невозможно изменить информацию заголовка – уже отправленные заголовки

Перетасовка первого уровня массива в PHP

Шаффле 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