Как получить случайное значение из массива
У меня есть массив с именем $ran = array(1,2,3,4);
Мне нужно получить случайное значение из этого массива и сохранить его в переменной, как я могу это сделать?
13 Solutions collect form web for “Как получить случайное значение из массива”
Вы также можете сделать:
$k = array_rand($array); $v = $array[$k];
Это способ сделать это, когда у вас есть ассоциативный массив.
PHP предоставляет функцию только для этого: array_rand ()
http://php.net/manual/en/function.array-rand.php
$ran = array(1,2,3,4); $randomElement = $ran[array_rand($ran, 1)];
Вы можете использовать mt_rand ()
$random = $ran[mt_rand(0, count($ran) - 1)];
Это также полезно, как функция, если вам нужно значение
function random_value($array, $default=null) { $k = mt_rand(0, count($array) - 1); return isset($array[$k])? $array[$k]: $default; }
$value = $array[array_rand($array)];
Функция array_rand
видимому, имеет неравномерное распределение на больших массивах, а не каждый элемент массива в равной степени может быть выбран. Использование shuffle в массиве, а затем взятие первого элемента не имеет этой проблемы:
$myArray = array(1, 2, 3, 4, 5); // Random shuffle shuffle($myArray); // First element is random now $randomValue = $myArray[0];
Вы можете использовать функцию array_rand для выбора случайного ключа из вашего массива, как показано ниже.
$array = array("one", "two", "three", "four", "five", "six"); echo $array[array_rand($array, 1)];
или вы можете использовать функции rand и count для выбора случайного индекса.
$array = array("one", "two", "three", "four", "five", "six"); echo $array[rand(0, count($array) - 1)];
$rand = rand(1,4);
или, в частности, для массивов:
$array = array('a value', 'another value', 'just some value', 'not some value'); $rand = $array[ rand(0, count($array)-1) ];
Производится из Collection::random()
Laravel Collection::random()
:
function array_random($array, $amount = 1) { $keys = array_rand($array, $amount); if ($amount == 1) { return $array[$keys]; } return array_intersect_key($array, array_flip($keys)); }
Применение:
$items = ['foo', 'bar', 'baz', 'lorem'=>'ipsum']; array_random($items); // 'bar' array_random($items, 2); // ['foo', 'ipsum']
Несколько примечаний:
-
$amount
должна быть меньше или равнаcount($array)
. -
array_rand()
не перетасовывает ключи (начиная с PHP 5.2.10, см. 48224 ), поэтому выбранные вами элементы всегда будут в оригинальном порядке. При необходимости используйтеshuffle()
.
Документация: array_rand()
, array_flip()
, array_intersect_key()
, shuffle()
edit: Функция Laravel заметно выросла с тех пор, см. Laravel 5.4's Arr::random()
. Вот что-то более сложное, вытекающее из взрослой функции Laravel:
function array_random($array, $number = null) { $requested = ($number === null) ? 1 : $number; $count = count($array); if ($requested > $count) { throw new \RangeException( "You requested {$requested} items, but there are only {$count} items available." ); } if ($number === null) { return $array[array_rand($array)]; } if ((int) $number === 0) { return []; } $keys = (array) array_rand($array, $number); $results = []; foreach ($keys as $key) { $results[] = $array[$key]; } return $results; }
Несколько основных моментов:
- Выбросить исключение, если не хватает доступных предметов
-
array_random($array, 1)
возвращает массив из одного элемента ( # 19826 ) - Значение поддержки «0» для количества элементов ( # 20439 )
Имеет ли ваш выбор какие-либо последствия для безопасности? Если это так, используйте random_int()
и array_keys()
. ( random_bytes()
– только PHP 7, но для PHP 5 существует полиполк ).
function random_index(array $source) { $max = count($source) - 1; $r = random_int(0, $max); $k = array_keys($source); return $k[$r]; }
Применение:
$array = [ 'apple' => 1234, 'boy' => 2345, 'cat' => 3456, 'dog' => 4567, 'echo' => 5678, 'fortune' => 6789 ]; $i = random_index($array); var_dump([$i, $array[$i]]);
Демо: https://3v4l.org/1joB1
Используйте rand (), чтобы получить случайное число для эхо-случайного ключа. В ex: 0 – 3
$ran = array(1,2,3,4); echo $ran[rand(0,3)];
Я основываю свой ответ на функции @ ÓlafurWaage. Я попытался использовать его, но столкнулся со справочными проблемами, когда попытался изменить возвращаемый объект. Я обновил его функцию для передачи и возврата по ссылке. Новая функция:
function &random_value(&$array, $default=null) { $k = mt_rand(0, count($array) - 1); if (isset($array[$k])) { return $array[$k]; } else { return $default; } }
} else {function &random_value(&$array, $default=null) { $k = mt_rand(0, count($array) - 1); if (isset($array[$k])) { return $array[$k]; } else { return $default; } }
Для получения дополнительной информации см. Мой вопрос в разделе « Передача / Возврат ссылок на объект + изменение объекта» не работает
Другая альтернатива чистым Mysql:
$result = mysql_query("select group_id from menu_groups group by group_id order by rand() limit 1"); $rand_group= mysql_fetch_row($result); $rand_group_id= $rand_group['group_id'];
Вы получаете случайное число из массива следующим образом:
$randomValue = array_rand($rand,1);