PHP 8.3.21 Released!

array_rand

(PHP 4, PHP 5, PHP 7, PHP 8)

array_randToma una o varias claves, al azar en un array

Descripción

array_rand(array $array, int $num = 1): int|string|array

Selecciona uno o varios valores al azar en un array y devuelve la o las claves de estos valores.

Precaución

Esta función no genera valores criptográficamente seguros y no debe ser utilizada para fines criptográficos o fines que requieran que los valores devueltos sean impredecibles.

Si se requiere aleatoriedad criptográficamente segura, se puede utilizar el Random\Randomizer con el motor Random\Engine\Secure. Para casos de uso simples, las funciones random_int() y random_bytes() proporcionan una API conveniente y segura respaldada por el CSPRNG del sistema operativo.

Parámetros

array

El array de entrada. No puede estar vacío.

num

Especifica el número de entradas que se desean recuperar. Debe ser mayor a cero e inferior o igual a la longitud de array.

Valores devueltos

Cuando se recupera una sola entrada, la función array_rand() devuelve la clave de una entrada elegida al azar. De lo contrario, se devolverá un array de claves de entradas aleatorias. Esto permite hacer una selección al azar de claves, o bien de valores. Si se devuelven varias claves, entonces lo serán en el orden en que estaban en el array original.

Errores/Excepciones

Lanza una ValueError si array está vacío, o si num está fuera de rango.

Historial de cambios

Versión Descripción
8.0.0 array_rand() ahora lanza una ValueError si num está fuera de rango; anteriormente, se generaba un E_WARNING y la función devolvía null.
8.0.0 array_rand() ahora lanza una ValueError si array está vacío; anteriormente, se generaba un E_WARNING y la función devolvía null.
7.1.0 El algoritmo interno de generación aleatoria ha sido modificado para usar el generador de números aleatorios »  Mersenne Twister en lugar de la función aleatoria libc

Ejemplos

Ejemplo #1 Ejemplo con 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";
?>

Ver también

add a note

User Contributed Notes 6 notes

up
93
Anonymous
15 years ago
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); ?>
up
76
Anonymous
12 years ago
It doesn't explicitly say it in the documentation, but PHP won't pick the same key twice in one call.
up
22
grzeniufication
7 years ago
<?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)]);
}
up
11
grzeniufication
7 years ago
<?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 ) ) ) ) );
up
0
fulachan2 at gmail dot com
3 years ago
array_rand () takes a random value without ever being able to go back in its choice of random value.
A simple example:
I decide to mix an array of 10 entries to retrieve 3 values. This choice will give increasing and random values.

$myarray = range(1,10);

$pm = array_rand($myarray,3);
// $pm return array(0->0,1->6,2->8)

But if I decide to shuffle an array of 10 entries to get 10 entries, array_rand () will choose to assign a value to each return value and therefore the return array will not be random.

$gm = array_rand($myarray,count($myarray));
// $gm not random array(0->0,1->1,2->2,3->3,4->4,5->5,6->6,7->7,8->8,9->9)

The easiest way to have a truly random value:
either use array_rand () in a loop of 1 value at a time

$deg = range(-60,60);
$size = range(16,64);
$color = ["blue","red","green","pink","orange","purple","grey","darkgreen","darkkhaki"];
$i = 0;
$longueur = 10;
do{
++$i;
printf("<span style='transform: rotateZ(%ddeg); display: inline-block;font-size: %spx; color:%s'>%s</span>",
$deg[array_rand($deg)],
$size[array_rand($size)],
$color[array_rand($color)],
$alnum[array_rand($alnum)]);

}while($i < $longueur);

------------------
or simply use shuffle () to shuffle the array really randomly.
up
-1
divinity76+spam at gmail dot com
3 years ago
for a cryptographically secure version, try

<?php

/**
* fetch a random key from array, using a cryptograpically secure rng
* discussed+reviewed at https://codereview.stackexchange.com/questions/275832/cryptographically-secure-version-of-the-core-array-rand-function/
*
* @param array $array
* @throws ValueError if array is empty
* @return int|string key
*/
function array_rand_cryptographically_secure(array $array)/*: int|string*/ {
$max = count ( $array ) - 1;
if (
$max < 0) {
throw new
ValueError ( 'Argument #1 ($array) cannot be empty' );
}
return
key ( array_slice ( $array, random_int ( 0, $max ), 1, true ) );
}

$tests = [
[
5, 6, 7],
[
'a' => 1, 'b' => 2, 'c' => 3],
[
'zero', 4 => 'four', 9 => 'nine'],
[
"PEAN"=>0],
[]
];
foreach (
$tests as $test) {
echo
array_rand_cryptographically_secure($test) . "\n";
}

?>
(this is an improved version, which unlike the first version, avoids copying *all* the keys)
To Top
OSZAR »