(PHP 4, PHP 5, PHP 7, PHP 8)
array_rand — Pick one or more random keys out of an array
Description CautionThis function does not generate cryptographically secure values, and must not be used for cryptographic purposes, or purposes that require returned values to be unguessable.
If cryptographically secure randomness is required, the Random\Randomizer may be used with the Random\Engine\Secure engine. For simple use cases, the random_int() and random_bytes() functions provide a convenient and secure API that is backed by the operating system’s CSPRNG.
Parametersarray
The input array. Cannot be empty.
num
Specifies how many entries should be picked. Must be greater than zero, and less than or equal to the length of array
When picking only one entry, array_rand() returns the key for a random entry. Otherwise, an array of keys for the random entries is returned. This is done so that random keys can be picked from the array as well as random values. If multiple keys are returned, they will be returned in the order they were present in the original array.
Errors/ExceptionsThrows a ValueError if array
is empty, or if num
is out of range.
num
is out of range; previously an E_WARNING
was raised, and the function returned null
. 8.0.0 array_rand() now throws a ValueError if array
is empty; previously an E_WARNING
was raised, and the function returned null
. 7.1.0 The internal randomization algorithm has been changed to use the » Mersenne Twister Random Number Generator instead of the libc rand function. Examples
Example #1 array_rand() example
<?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";
?>
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); ?>
Anonymous ¶
13 years ago
It doesn't explicitly say it in the documentation, but PHP won't pick the same key twice in one call.
7 years ago
<?phpfunction 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)]);
}
grzeniufication ¶
7 years ago
<?php
$a = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ];
$n = 3;print_r( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) );print_r( array_values( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) ) );
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.
divinity76+spam at gmail dot com ¶
3 years ago
for a cryptographically secure version, try
<?phpfunction array_rand_cryptographically_secure(array $array){
$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)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4