Бывают случаи, когда array_rand()
недостаточно хорош.
Хотя я знаю, что он возвращает ключи, а не значения, я нахожу его непонятным.
Но самое главное, array_rand()
не дает равных шансов для всех ключей (как видно в Array_rand, не перетасовывается, или Array_rand не является случайным и множеством других примеров).
Заметным способом улучшить рандомизацию массива является функция shuffle()
но она может быть довольно требовательна к ressources, плюс, если ключи важны, хорошо они теряются вместе с ней.
Что было бы хорошей и быстрой альтернативой этой слегка неуклюжей функции?
Я придумал эти две функции:
function random_key($array){ $keys=array_keys($array); return $keys[mt_rand(0, count($keys) - 1)]; } function random_value($array){ $values=array_values($array); return $values[mt_rand(0, count($values) - 1)]; }
Оба они хорошо работают с любыми типами массивов, не изменяют первоначальный, дают более реалистичные случайные результаты, и их имена описываются сами.
Главный недостаток заключается в том, что в отличие от array_rand они могут давать только один элемент.
(Помогли с ответом от Как получить случайное значение из массива )
Я не согласен с вашим заявлением:
array_rand () не дает равных шансов для всех ключей.
Предопределенные функции, такие как array_rand()
, предназначены для того, чтобы делать то, для чего они созданы, но если вы каким-то образом не хотите полагаться на это и хотите использовать свои собственные, вы можете попробовать что-то вроде этого:
function array_rand_alternative($array){ return rand(0,count($array)-1); }
Вы можете проверить эту функцию как:
$a=[5,2,1,3]; for($i=0;$i<10;$i++) echo array_rand_alternative($a).",";
Но все же я предлагаю вам использовать предопределенные функции, так как они хорошо тестируются разработчиками.