Intereting Posts
bind-адрес отсутствует в файле my.cnf – Laravel mongo.so:> undefined symbol: php_json_encode в Unknown on line 0. После установки mongo драйвер для php PHP: вызов хранимой процедуры MySQL с параметрами INPUT AND OUTPUT (НЕ «INOUT») Сохранить диаграммы Google как изображение Является ли хорошей практикой инициализировать элементы в ассоциативном массиве в php? Как я могу захватить переменные сеанса php в javascript без обновления страницы? Как я могу конкатенировать константу и переменную и хранить ее в константе класса с помощью PHP? Рассчитывать месяцы, годы и дни между двумя заданными датами как временная метка API Twitter возвращает NULL на XAMPP Как добавить операторов в конструктор запросов doctrine2, где оператор Украшение HashMap, добавляющее случайность для предотвращения (D) DoS Строка формата php sprintf php imap получить с адреса электронной почты php доступ к атрибутам в json Как добавить пользовательский валидатор в свой FormRequest?

PHP Random Shuffle Array Поддержание ключа => Значение

Я искал Google для ответа, но не могу найти что-то безумное и не могу позволить себе испортить это (собирается жить на производственный сайт).

У меня есть расширенный поиск с 20 + фильтрами, который возвращает массив, содержащий идентификатор и расстояние. То, что мне нужно сделать, это перетасовать эти результаты для отображения в случайном порядке каждый раз. Массив, который у меня есть, появляется на данный момент:

Array ( [0] => Array ( [id] => 1 [distance] => 1.95124994507577 ) [1] => Array ( [id] => 13 [distance] => 4.75358968511882 ) [2] => Array ( [id] => 7 [distance] => 33.2223233233323 ) [3] => Array ( [id] => 21 [distance] => 18.2155453552336 ) [4] => Array ( [id] => 102 [distance] = 221.2212587899658 ) ) 

То, что мне нужно сделать, это случайность или порядок каждого из них, но поддержка пар id и distance, то есть:

 Array ( [4] => Array ( [id] => 102 [distance] = 221.2212587899658 ) [1] => Array ( [id] => 13 [distance] => 4.75358968511882 ) [3] => Array ( [id] => 21 [distance] => 18.2155453552336 ) [2] => Array ( [id] => 7 [distance] => 33.2223233233323 ) [0] => Array ( [id] => 1 [distance] => 1.95124994507577 ) ) 

Благодаря 🙂

Первая публикация пользователя в соответствии с shuffle :

Перемешать ассоциативный и неассоциативный массив, сохраняя пары ключей, значений. Также возвращает перетасованный массив вместо того, чтобы перетасовывать его на месте.

 function shuffle_assoc($list) { if (!is_array($list)) return $list; $keys = array_keys($list); shuffle($keys); $random = array(); foreach ($keys as $key) { $random[$key] = $list[$key]; } return $random; } 

Прецедент:

 $arr = array(); $arr[] = array('id' => 5, 'foo' => 'hello'); $arr[] = array('id' => 7, 'foo' => 'byebye'); $arr[] = array('id' => 9, 'foo' => 'foo'); print_r(shuffle_assoc($arr)); print_r(shuffle_assoc($arr)); print_r(shuffle_assoc($arr)); 

Начиная с 5.3.0 вы можете:

 uksort($array, function() { return rand() > rand(); }); 

Взгляните на эту функцию здесь:

  $foo = array('A','B','C'); function shuffle_with_keys(&$array) { /* Auxiliary array to hold the new order */ $aux = array(); /* We work with an array of the keys */ $keys = array_keys($array); /* We shuffle the keys */`enter code here` shuffle($keys); /* We iterate thru' the new order of the keys */ foreach($keys as $key) { /* We insert the key, value pair in its new order */ $aux[$key] = $array[$key]; /* We remove the element from the old array to save memory */ unset($array[$key]); } /* The auxiliary array with the new order overwrites the old variable */ $array = $aux; } shuffle_with_keys($foo); var_dump($foo); с  $foo = array('A','B','C'); function shuffle_with_keys(&$array) { /* Auxiliary array to hold the new order */ $aux = array(); /* We work with an array of the keys */ $keys = array_keys($array); /* We shuffle the keys */`enter code here` shuffle($keys); /* We iterate thru' the new order of the keys */ foreach($keys as $key) { /* We insert the key, value pair in its new order */ $aux[$key] = $array[$key]; /* We remove the element from the old array to save memory */ unset($array[$key]); } /* The auxiliary array with the new order overwrites the old variable */ $array = $aux; } shuffle_with_keys($foo); var_dump($foo); 

Оригинальный пост здесь: http://us3.php.net/manual/en/function.shuffle.php#83007

Мне было трудно с большей частью предоставленных ответов – поэтому я создал этот небольшой фрагмент, который взял мои массивы и рандомизировал их, сохраняя при этом свои ключи:

 function assoc_array_shuffle($array) { $orig = array_flip($array); shuffle($array); foreach($array AS $key=>$n) { $data[$n] = $orig[$n]; } return array_flip($data); } 
 function shuffle_assoc($array) { $keys = array_keys($array); shuffle($keys); return array_merge(array_flip($keys), $array); } 

Попробуйте использовать алгоритм fisher-yates отсюда :

 function shuffle_me($shuffle_me) { $randomized_keys = array_rand($shuffle_me, count($shuffle_me)); foreach($randomized_keys as $current_key) { $shuffled_me[$current_key] = $shuffle_me[$current_key]; } return $shuffled_me; } 

Я должен был реализовать что-то похожее на это для моей дипломной дипломной работы, и это работает очень хорошо.

У Чарльза Ильи Кемпео есть хорошая запись по этой проблеме и функция, которая очень хорошо работала для меня:

 function shuffle_assoc($array) { // Initialize $shuffled_array = array(); // Get array's keys and shuffle them. $shuffled_keys = array_keys($array); shuffle($shuffled_keys); // Create same array, but in shuffled order. foreach ( $shuffled_keys AS $shuffled_key ) { $shuffled_array[ $shuffled_key ] = $array[ $shuffled_key ]; } // foreach // Return return $shuffled_array; } 

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

  $list = array_combine(range(1,10),range(100,110)); $shuffle_list = shuffle_assoc($list); function shuffle_assoc($list) { if (!is_array($list)) return $list; $keys = array_keys($list); shuffle($list); $random = array(); foreach ($keys as $k => $key) { $random[$key] = $list[$k]; } return $random; }