函數原型
array_rand(array $array, int $num = 1): int|string|array
回傳值行為
| 情況 | 回傳型別 | 說明 |
$num = 1 (預設) | int|string | 單一**鍵名** (非值) |
$num > 1 | array | 鍵名陣列 |
| 陣列為空 | 觸發 E_WARNING | 回傳 null |
基本用法
<?php
$fruits = ['a' => 'Apple', 'b' => 'Banana', 'c' => 'Cherry'];
// 取 1 個鍵名
$key = array_rand($fruits);
echo "Key: $key, Value: {$fruits[$key]}";
// Key: b, Value: Banana
// 取 2 個鍵名
$keys = array_rand($fruits, 2);
print_r($keys);
// Array ( [0] => c [1] => a )
// 取得對應值
$values = array_intersect_key($fruits, array_flip($keys));
print_r($values);
// Array ( [c] => Cherry [a] => Apple )
?>
進階:取得隨機值 (而非鍵名)
<?php
function array_random_values(array $array, int $num = 1): array
{
if (empty($array)) return [];
$num = min($num, count($array));
$keys = array_rand($array, $num);
// array_rand 回傳單一鍵名時非陣列,需統一
$keys = (array)$keys;
return array_intersect_key($array, array_flip($keys));
}
$data = ['id1' => 'A', 'id2' => 'B', 'id3' => 'C', 'id4' => 'D'];
print_r(array_random_values($data, 2));
// Array ( [id3] => C [id1] => A )
?>
隨機打亂陣列順序
<?php
// 方法 1: shuffle (修改原陣列,重設數字索引)
$arr = [1, 2, 3, 4, 5];
shuffle($arr);
// [3, 1, 5, 2, 4]
// 方法 2: array_rand 保留鍵名關聯
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
$keys = array_rand($arr, count($arr));
$shuffled = array_intersect_key($arr, array_flip($keys));
// 保留鍵名: ['c' => 3, 'a' => 1, 'b' => 2]
// 方法 3: 現代 PHP 8.1+ 使用 Random\Randomizer
$randomizer = new Random\Randomizer();
$arr = [1, 2, 3, 4, 5];
$randomizer->shuffle($arr); // 原地打亂,回傳 void
?>
加權隨機抽樣 (非均勻機率)
<?php
function weightedRandom(array $weights): string
{
// $weights = ['A' => 10, 'B' => 30, 'C' => 60] // 權重總和 100
$total = array_sum($weights);
$rand = mt_rand(1, $total);
$cum = 0;
foreach ($weights as $key => $weight) {
$cum += $weight;
if ($rand <= $cum) return $key;
}
return array_key_first($weights); // 兜底
}
$prizes = ['大獎' => 1, '小獎' => 9, '無' => 90];
$counts = [];
for ($i = 0; $i < 10000; $i++) {
$counts[weightedRandom($prizes)]++;
}
print_r($counts);
// 大獎 ≈ 100, 小獎 ≈ 900, 無 ≈ 9000
?>
安全性注意
array_rand 使用 Mersenne Twister (**非加密安全**)
- 密碼學用途 (Token、抽獎、洗牌) 請用
random_int()、Random\Randomizer (PHP 8.2+)
<?php
// 加密安全的隨機打亂 (PHP 8.2+)
$randomizer = new Random\Randomizer(
new Random\Engine\Secure() // 使用 OS CSPRNG
);
$cards = range(1, 52);
$randomizer->shuffle($cards); // 適合發牌遊戲
// PHP 7/8.1 相容寫法
function secureShuffle(array &$array): void
{
$n = count($array);
for ($i = $n - 1; $i > 0; $i--) {
$j = random_int(0, $i);
[$array[$i], $array[$j]] = [$array[$j], $array[$i]];
}
}
?>