Выбор случайного элемента из ассоциативного массива PHP

У меня есть ассоциативный массив в PHP, и я хочу выбрать из него случайную пару ключ/значение. Вот что у меня есть до сих пор:

Инициализировать.

$locations = array();

Выполняет цикл SQL-запроса и добавляет пары ключ/значение:

array_push($locations, "'$location_id' => '$location_name'");

Позже я выбираю случайный индекс массива:

$rand = array_rand($locations);

Ранд — это просто число. Итак, location[$rand] дает мне что-то вроде:

'1' => 'Location 1'

ОК, отлично, ассоциированный элемент массива. На данный момент я не знаю ключ этого массива assoc, поэтому я пробовал следующие вещи:

foreach($locations[$rand] as $loc_id => $location_name) { 
    echo "$key : $value<br/>\n";
}

$loc_id, $location_name = each($locations[$rand]);

$location_name = $locations[key($rand)];

Ни одна из этих 3-х попыток не работает. Все они выдают ошибки типа «Переданная переменная не является массивом».

Я уверен, что есть простой 1 лайнер, который может выбрать случайную пару ключ/значение из массива. Или мой синтаксис отключен. Я был бы очень признателен за помощь.


person Jeff    schedule 26.08.2011    source источник


Ответы (3)


array_rand() возвращает ключ из массива, а не значение. Вы можете просто использовать:

$location_name = $locations[$rand];

Чтобы получить название местоположения.


Вот полный пример: http://codepad.org/zR2YdMGN

Просто нажмите «Отправить» несколько раз, и вы увидите, как работает случайный код.

person Paul    schedule 26.08.2011
comment
Это все еще не дает ключ. - person Mark Biesheuvel; 26.08.2011
comment
Хорошо, извини. Тогда утверждение ($rand - это просто число) из ОП неверно. И я был достаточно глуп, чтобы не проверить это утверждение. - person Mark Biesheuvel; 26.08.2011
comment
@M_rk Возвращает ключ :) Я обновил свой ответ, чтобы в нем была ссылка на справочную страницу PHP для array_rand - person Paul; 26.08.2011

твой толчок неправильный

$locations[$location_id] = $location_name;

так должно быть

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

person Your Common Sense    schedule 26.08.2011

person    schedule
comment
Ваша проблема в array_push($locations, "'$location_id' => '$location_name'");. Вместо этого сделайте следующее: $locations[$location_id] = $location_name;. Тогда array_rand($location) вернет случайное $location_id; и вы можете получить имя с помощью $name = $locations[$location_id]. - person Arnaud Le Blanc; 26.08.2011
comment
вы все правы, конечно - я просто выбрал этот, потому что я лучше всего работаю с примером кода. и да, я очень смущен тем, что толчок был неправильным. Я пишу тонны на Perl (w хэши), так что я должен был знать лучше! СПАСИБО! - person Jeff; 26.08.2011
comment
здорово, ты спас мой день - person Shahrokhian; 29.01.2014