If the array elements are unique, and are all integers or strings, here is a simple way to pick $n random *values* (not keys) from an array $array:
<?php array_rand(array_flip($array), $n); ?>
(PHP 4, PHP 5, PHP 7, PHP 8)
array_rand — Выбирает один или несколько случайных ключей из массива
Функция выбирает один или несколько случайных элементов из массива и возвращает ключ, или ключи, случайных элементов.
Функция не создаёт криптографически безопасные значения и не должна использоваться в криптографических целях или целях, которые требуют, чтобы возвращаемые значения были недоступны для разгадывания.
Если нужна криптографически безопасная случайная последовательность, можно использовать класс Random\Randomizer с движком Random\Engine\Secure. Для простых сценариев существуют функции random_int() и random_bytes() с удобным API криптографически безопасного генератора псевдослучайных чисел (CSPRNG), поддерживаемого операционной системой.
array
Непустой входной массив.
num
Определяет сколько элементов выберет функция. Количество
элементов должно быть больше нуля и меньше или равно количеству
элементов массива array
.
Функция array_rand() возвращает ключ случайного элемента, когда выбирает только один элемент. В остальных случаях функция возвращает массив ключей случайных элементов. Это сделано так, чтобы функция могла выбрать из массива как случайные ключи, так и случайные значения. Функция, когда возвращает массив ключей, вернёт ключи в порядке, в котором их объявили в исходном массиве.
Функция выбросит исключение ValueError,
если массив array
пуст
или значение параметра num
выходит за пределы диапазона.
Версия | Описание |
---|---|
8.0.0 |
Теперь функция array_rand() выбрасывает
исключение ValueError,
если значение параметра num выходит
за пределы диапазона; раньше функция выдавала ошибку уровня
E_WARNING и возвращала значение null .
|
8.0.0 |
Теперь функция array_rand() выбрасывает
исключение ValueError,
если массив array пуст; раньше
функция выдавала ошибку уровня E_WARNING
и возвращала значение null .
|
7.1.0 | Внутренний алгоритм получения случайных чисел изменён с функции rand библиотеки libc на генератор на базе » Вихря Мерсенна. |
Пример #1 Пример использования функции array_rand()
<?php
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "\n";
echo $input[$rand_keys[1]] . "\n";
?>
If the array elements are unique, and are all integers or strings, here is a simple way to pick $n random *values* (not keys) from an array $array:
<?php array_rand(array_flip($array), $n); ?>
It doesn't explicitly say it in the documentation, but PHP won't pick the same key twice in one call.
<?php
/**
* Wraps array_rand call with additional checks
*
* TLDR; not so radom as you'd wish.
*
* NOTICE: the closer you get to the input arrays length, for the n parameter, the output gets less random.
* e.g.: array_random($a, count($a)) == $a will yield true
* This, most certainly, has to do with the method used for making the array random (see other comments).
*
* @throws OutOfBoundsException – if n less than one or exceeds size of input array
*
* @param array $array – array to randomize
* @param int $n – how many elements to return
* @return array
*/
function array_random(array $array, int $n = 1): array
{
if ($n < 1 || $n > count($array)) {
throw new OutOfBoundsException();
}
return ($n !== 1)
? array_values(array_intersect_key($array, array_flip(array_rand($array, $n))))
: array($array[array_rand($array)]);
}
<?php
// An example how to fetch multiple values from array_rand
$a = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ];
$n = 3;
// If you want to fetch multiple values you can try this:
print_r( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) );
// If you want to re-index keys wrap the call in 'array_values':
print_r( array_values( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) ) );