PHP Conference Japan 2024

array_rand

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

array_rand從陣列中取出一個或多個隨機鍵值

說明

array_rand(陣列 $array, 整數 $num = 1): 整數|字串|陣列

從陣列中取出一個或多個隨機元素,並返回隨機元素的鍵值(或多個鍵值)。

注意

此函式不會產生密碼安全的數值,而且*不得*用於加密目的,或需要傳回值不可預測的用途。

如果需要加密安全的隨機性,可以使用 Random\Randomizer 搭配 Random\Engine\Secure 引擎。對於簡單的使用案例,random_int()random_bytes() 函式提供了一個方便且安全的 API,它由作業系統的 CSPRNG 支援。

參數

array

輸入陣列。不可為空。

num

指定要挑選多少個項目。必須大於零,且小於或等於 array 的長度。

回傳值

當只挑選一個項目時,array_rand() 會回傳一個隨機項目的鍵值。否則,會回傳一個包含隨機項目鍵值的陣列。這樣做的目的是可以從陣列中挑選隨機鍵值以及隨機值。如果回傳多個鍵值,它們將會以它們在原始陣列中的順序回傳。

錯誤/例外

如果 array 為空,或者 num 超出範圍,則會拋出 ValueError

更新日誌

版本 說明
8.0.0 如果 num 超出範圍,array_rand() 現在會拋出 ValueError;以前會引發 E_WARNING,並且函式會回傳 null
8.0.0 如果 array 為空,array_rand() 現在會拋出 ValueError;以前會引發 E_WARNING,並且函式會回傳 null
7.1.0 內部隨機化演算法已更改為使用 » 梅森旋轉演算法 隨機數產生器,而不是 libc rand 函式。

範例

範例 #1 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";
?>

參見

新增筆記

使用者貢獻的筆記 6 則筆記

匿名
15 年前
如果陣列元素是唯一的,並且都是整數或字串,以下是一種從陣列 $array 中選取 $n 個隨機 *值*(而非鍵)的簡單方法

<?php array_rand(array_flip($array), $n); ?>
匿名
12 年前
文件中沒有明確說明,但 PHP 在一次呼叫中不會選取相同的鍵。
grzeniufication
6 年前
<?php

/**
* 包裝 array_rand 呼叫並進行額外檢查
*
* 長話短說:不如你想像的隨機。
*
* 注意:n 參數越接近輸入陣列的長度,輸出就越不隨機。
* 例如:array_random($a, count($a)) == $a 將會傳回 true
* 這肯定與用於使陣列隨機的方法有關(請參閱其他註釋)。
*
* @throws OutOfBoundsException – 如果 n 小於 1 或超過輸入陣列的大小
*
* @param array $array – 要隨機化的陣列
* @param int $n – 要傳回的元素數量
* @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
6 年前
<?php
// 示範如何從 array_rand 中取出多個值
$a = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ];
$n = 3;

// 如果您想取出多個值,可以嘗試這樣做:
print_r( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) );

// 如果您想重新索引鍵值,請將呼叫包在 'array_values' 中:
print_r( array_values( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) ) );
fulachan2 at gmail dot com
3 年前
array_rand () 會取得一個隨機值,而且不會再次選到同一個值。
一個簡單的例子
我決定從一個有 10 個項目的陣列中取出 3 個值。這個選擇將會產生遞增且隨機的值。

$myarray = range(1,10);

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

但如果我決定從一個有 10 個項目的陣列中取出 10 個項目,array_rand () 會為每個回傳值指定一個值,因此回傳的陣列將不會是隨機的。

$gm = array_rand($myarray,count($myarray));
// $gm 不是隨機陣列 array(0->0,1->1,2->2,3->3,4->4,5->5,6->6,7->7,8->8,9->9)

獲得真正隨機值最簡單的方法
可以使用迴圈一次呼叫 array_rand () 取得一個值

$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);

------------------
或者簡單地使用 shuffle () 來真正隨機地打亂陣列。
divinity76+spam at gmail dot com
2 年前
若要使用密碼學安全的版本,請嘗試

<?php

/**
* 從陣列中獲取一個隨機鍵,使用加密安全的隨機數產生器
* 在 https://codereview.stackexchange.com/questions/275832/cryptographically-secure-version-of-the-core-array-rand-function/ 討論和審閱
*
* @param array $array
* @throws ValueError 如果陣列為空
* @return int|string 鍵值
*/
function array_rand_cryptographically_secure(array $array)/*: int|string*/ {
$max = count($array) - 1;
if (
$max < 0) {
throw new
ValueError('參數 #1 ($array) 不可為空');
}
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";
}

?>
(這是改良版本,與第一版不同,它避免複製*所有*鍵值)
To Top