array_rand

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

array_rand从数组中随机取出一个或多个随机键

说明

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

从数组中取出一个或多个随机的单元,并返回随机条目对应的键(一个或多个)。 它使用了伪随机数产生算法,所以不适合密码学场景。

参数

array

输入的数组。

num

指定要取出的单元数量。

返回值

如果只取出一个,array_rand() 返回随机单元的键名。 否则就返回包含随机键名的数组。 完成后,就可以根据随机的键获取数组的随机值。 如果返回的是包含随机键名的数组,数组单元的顺序按照键名在原数组中的顺序排列。 取出数量如果超过 array 的长度,就会导致 E_WARNING 错误,并返回 NULL。

更新日志

版本 说明
7.1.0 内部随机化算法已从 libc rand 函数更改为使用 » 梅森旋转算法(Mersenne Twister) 随机数生成器。

范例

Example #1 array_rand() 例子

<?php
$input 
= array("Neo""Morpheus""Trinity""Cypher""Tank");
$rand_keys array_rand($input2);
echo 
$input[$rand_keys[0]] . "\n";
echo 
$input[$rand_keys[1]] . "\n";
?>

参见

User Contributed Notes

grzeniufication 03-Mar-2018 10:19
<?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)]);
}
grzeniufication 03-Mar-2018 09:22
<?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 ) ) ) ) );
Anonymous 13-Jul-2012 02:42
It doesn't explicitly say it in the documentation, but PHP won't pick the same key twice in one call.
Anonymous 02-Oct-2009 01:04
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); ?>