Я искал 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; }