Array rand: примеры (PHP)

Функция array_rand в PHP: выбор случайных элементов массива
Раздел: Работа с массивами
array_rand(array $array, int $num = 1): int|string|array
Функция array_rand в PHP

Функция array_rand() используется для получения случайного набора ключей из массива. Основное применение связано с необходимостью случайного выбора одного или нескольких элементов из коллекции данных. Функция становится полезной в задачах, связанных с генерацией случайных рекомендаций, выбором случайного теста или просто перемешиванием данных.

Синтаксис и аргументы

Синтаксис функции: array_rand(array $array, int $num = 1): int|string|array

  • $array (обязательный). Входной массив, из которого происходит выборка ключей.
  • $num (опциональный). Количество случайно выбираемых ключей. По умолчанию равен 1. Если указано значение больше 1, функция возвращает массив со случайными ключами. Если значение равно 1 или не указано, возвращается один ключ (скалярное значение).

Функция использует встроенный генератор псевдослучайных чисел, который можно инициализировать с помощью srand() или mt_srand() для получения воспроизводимых результатов.

Примеры использования array_rand
Выбор одного случайного ключа

При указании одного аргумента функция возвращает случайный ключ.

$fruits = ['apple' => 'яблоко', 'orange' => 'апельсин', 'banana' => 'банан'];
$randomKey = array_rand($fruits);
echo $randomKey;
orange
Выбор нескольких случайных ключей
$colors = ['красный', 'зеленый', 'синий', 'желтый', 'черный'];
$randomKeys = array_rand($colors, 2);
print_r($randomKeys);
Array
(
    [0] => 1
    [1] => 3
)
Получение значений по выбранным ключам
$data = ['a' => 100, 'b' => 200, 'c' => 300, 'd' => 400];
$keys = array_rand($data, 2);
$selected = [];
foreach ($keys as $key) {
    $selected[$key] = $data[$key];
}
print_r($selected);
Array
(
    [a] => 100
    [c] => 300
)
Похожие функции в PHP
  • shuffle(). Перемешивает значения массива, теряя ключи. Используется, когда важен случайный порядок всех элементов, а не выборка.
  • mt_rand() / rand(). Генерируют случайные числа. Применяются для получения случайного числового индекса, но требуют знания границ массива (mt_rand(0, count($array)-1)).
  • random_int(). Генерирует криптографически безопасные случайные целые числа. Подходит для выбора случайного индекса, когда важна безопасность.

Функцию array_rand() предпочтительнее использовать для простого выбора случайных ключей из ассоциативных или индексированных массивов без необходимости их перемешивания. shuffle() лучше подходит для полного перемешивания значений, особенно если сохранение ключей не требуется.

Типичные ошибки
Запрос большего количества ключей, чем есть в массиве
$smallArray = ['one', 'two'];
// Запрос 3 ключей из массива с 2 элементами
$keys = @array_rand($smallArray, 3);
var_dump($keys);
NULL

Функция вернет NULL и вызовет ошибку уровня E_WARNING, если второй аргумент превышает количество элементов в массиве.

Использование результата как значения, а не ключа
$items = ['a' => 'Alpha', 'b' => 'Beta'];
$key = array_rand($items);
// Ожидание значения, но получение ключа
echo "Случайный элемент: $key";
Случайный элемент: a

Для получения значения необходимо использовать ключ: echo $items[$key];.

Предположение, что функция возвращает массив
$array = [10, 20, 30];
$result = array_rand($array);
// count() вызовет ошибку, если $result - не массив
if (count($result) > 1) {
    echo 'Много элементов';
}

При $num=1 функция возвращает скаляр, а не массив.

Изменения в новых версиях PHP
  • PHP 7.1: Функция начала использовать внутренний алгоритм генерации случайных чисел, который является криптографически безопасным (random_int() вместо rand()).
  • PHP 8.0: Изменен способ обработки недопустимых параметров. Вместо предупреждения (E_WARNING) теперь выбрасывается исключение ValueError, если второй параметр превышает количество элементов или меньше 1.
// PHP 8.0 и выше
$arr = [1, 2];
try {
    $keys = array_rand($arr, 3);
} catch (ValueError $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
Ошибка: array_rand(): Argument #2 ($num) must be between 1 and the number of elements in argument #1 ($array)
Расширенные примеры
Создание случайной выборки для тестирования
Пример php
$users = [
    'id1' => ['name' => 'Анна', 'score' => 85],
    'id2' => ['name' => 'Иван', 'score' => 92],
    'id3' => ['name' => 'Мария', 'score' => 78],
    'id4' => ['name' => 'Петр', 'score' => 95],
    'id5' => ['name' => 'Ольга', 'score' => 88]
];
// Выбор 3 случайных пользователей для A/B теста
$testGroupKeys = array_rand($users, 3);
$testGroup = array_intersect_key($users, array_flip((array)$testGroupKeys));
print_r($testGroup);
Array
(
    [id2] => Array
        (
            [name] => Иван
            [score] => 92
        )
    [id4] => Array
        (
            [name] => Петр
            [score] => 95
        )
    [id5] => Array
        (
            [name] => Ольга
            [score] => 88
        )
)
Использование с многомерными массивами
Пример php
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    [10, 11, 12]
];
// Выбор случайной строки (подмассива)
$randomRowKey = array_rand($matrix);
$randomRow = $matrix[$randomRowKey];
print_r($randomRow);
Array
(
    [0] => 10
    [1] => 11
    [2] => 12
)
Генерация случайной последовательности без повторов
Пример php
$items = range('A', 'Z');
$selectedIndices = [];
$needed = 5;
while (count($selectedIndices) < $needed) {
    $available = array_diff(array_keys($items), $selectedIndices);
    $randomIndex = array_rand(array_flip($available));
    $selectedIndices[] = $randomIndex;
}
$result = array_intersect_key($items, array_flip($selectedIndices));
print_r($result);
Array
(
    [13] => N
    [2] => C
    [19] => T
    [8] => I
    [24] => Y
)
Аналоги функции в других языках

Array rand в Python

Модуль random предоставляет функции choice() и sample().

import random
fruits = ['apple', 'orange', 'banana']
# Один элемент
print(random.choice(fruits))
# Несколько уникальных элементов
print(random.sample(fruits, 2))
orange
['banana', 'apple']

Array rand в Javascript

В JS нет встроенной функции, но её легко реализовать.

const colors = ['red', 'green', 'blue'];
// Один элемент
const randomIndex = Math.floor(Math.random() * colors.length);
console.log(colors[randomIndex]);
// Несколько уникальных элементов (упрощенный вариант)
function getRandomElements(arr, num) {
    const shuffled = [...arr].sort(() => 0.5 - Math.random());
    return shuffled.slice(0, num);
}
console.log(getRandomElements(colors, 2));
green
['blue', 'red']

Array rand в MySQL

Для случайной выборки строк используется ORDER BY RAND().

SELECT * FROM products ORDER BY RAND() LIMIT 3;

В отличие от PHP, MySQL перемешивает весь набор данных, что может быть медленно на больших таблицах.

PHP array_rand function comments

En
Array rand Pick one or more random keys out of an array