Función PHP: array_rand
La función PHP array_rand es una herramienta útil para obtener elementos aleatorios de un array. Acepta un array y devuelve una o más claves.
La función array_rand() de PHP selecciona una o más claves al azar de un array. No devuelve los valores en sí — devuelve claves, que luego se usan para leer los elementos correspondientes. Esta pequeña distinción es la fuente de confusión más común con la función, por lo que vale la pena tenerla en cuenta a lo largo de esta página.
array_rand() es la herramienta adecuada cuando necesitas seleccionar un elemento aleatorio de una lista (una cita aleatoria, un banner aleatorio, una pregunta aleatoria) o tomar un subconjunto aleatorio de un array más grande sin modificar ni reordenar el original.
Sintaxis
array_rand(array $array, int $num = 1): int|string|array| Parámetro | Descripción |
|---|---|
$array | El array de entrada del que se selecciona. No debe estar vacío. |
$num | Cuántas claves devolver. Opcional, por defecto es 1. Debe estar entre 1 y la longitud del array. |
El tipo de retorno depende de $num:
- Cuando
$numes1(u omitido), devuelve una clave única — unintpara un array numérico o unstringpara una clave de cadena. - Cuando
$numes2o más, devuelve un array de claves.
Seleccionar un solo elemento
El uso más común es obtener un valor aleatorio. Llama a array_rand() para obtener una clave y luego usa esa clave para acceder al array:
array_rand($colors) devuelve una clave aleatoria única (un índice entero en este caso), que se usa para leer el color correspondiente. Los dos pasos se combinan a menudo en una sola línea: $colors[array_rand($colors)].
Seleccionar varios elementos
Pasa un segundo argumento para obtener varias claves. El resultado es un array de claves, y las claves se devuelven en el mismo orden en que aparecen en el array original — solo cuáles claves se eligen es aleatorio, no su orden:
<?php
$colors = ["red", "green", "blue", "yellow", "orange"];
$keys = array_rand($colors, 2); // e.g. [1, 4]
foreach ($keys as $key) {
echo $colors[$key] . "\n";
}
?>Como array_rand() devuelve claves y no valores, la forma habitual de mapearlas de vuelta a valores es array_map:
<?php
$colors = ["red", "green", "blue", "yellow", "orange"];
$picked = array_map(fn($k) => $colors[$k], (array) array_rand($colors, 2));
print_r($picked);
?>Valor de retorno y claves de cadena
Un malentendido frecuente es que array_rand() siempre devuelve enteros. No es así — devuelve cualquier clave que haya seleccionado, preservando su tipo original. Para un array asociativo, eso significa claves de cadena:
<?php
$fruit = ["a" => "apple", "b" => "banana", "c" => "cherry"];
$key = array_rand($fruit);
echo $key; // e.g. "b" (a string key)
echo "\n";
echo $fruit[$key]; // e.g. "banana"
?>Problemas comunes
- Devuelve claves, no valores.
array_rand($arr)te da una clave; aún necesitas$arr[$key]para obtener el valor. - Array vacío. Llamar a
array_rand()con un array vacío lanza unValueError(PHP 8+) o emite una advertencia y devuelvenullen versiones anteriores. Comprueba el array primero. $numfuera de rango. Pedir más elementos de los que contiene el array genera unValueError.- No es criptográficamente seguro.
array_rand()está bien para rotar banners o muestrear datos, pero nunca lo uses para seleccionar tokens de sesión, contraseñas o cualquier cosa sensible para la seguridad. Usarandom_int()con un CSPRNG para eso.
Funciones relacionadas
shuffle()— reordena aleatoriamente todos los elementos de un array en su lugar.str_shuffle()— mezcla aleatoriamente los caracteres de una cadena.rand()ymt_rand()— generan un entero aleatorio en un rango.array_slice()— extrae una porción contigua de un array.
Conclusión
array_rand() es una forma compacta de seleccionar claves aleatorias de un array — una cuando se omite $num, un array de ellas cuando se pasa un número. Recuerda que devuelve claves (preservando su tipo original, entero o cadena), que las claves elegidas mantienen el orden original del array, y que no es adecuada para aleatoriedad sensible a la seguridad.