shuffle() 是 PHP 內建函式,用於**就地打亂陣列順序**,常用於抽獎、隨機推薦、測試資料生成等場景。本文說明用法細節、鍵值重置行為、多維陣列處理與效能考量。
<?php
$fruits = ['蘋果', '香蕉', '橘子', '葡萄'];
shuffle($fruits);
print_r($fruits);
// 輸出順序隨機,如:[0=>橘子, 1=>蘋果, 2=>葡萄, 3=>香蕉]
?>
✅ 回傳 bool(成功 true),**直接修改原陣列**,不返回新陣列。
<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
shuffle($arr);
// 字串鍵保留,順序打亂:['b'=>2, 'a'=>1, 'c'=>3]
$num = [10 => 'x', 20 => 'y', 30 => 'z'];
shuffle($num);
// 數字鍵**重新索引從 0 開始**:[0=>'y', 1=>'z', 2=>'x']
?>
⚠️ 若需保留數字鍵關聯,請改用 uksort($arr, fn() => rand(-1, 1)) 或自訂演算法。
<?php
$prizes = ['一獎'=>'iPhone', '二獎'=>'AirPods', '三獎'=>'充電寶', '謝謝惠顧'=>null];
$keys = array_keys($prizes);
shuffle($keys);
$win = $keys[0];
echo "恭喜中獎:{$prizes[$win]}";
?>
<?php
$products = range(1, 100); // 100 個商品 ID
shuffle($products);
$recommend = array_slice($products, 0, 5); // 取前 5 個
?>
<?php
$users = [
['id'=>1, 'name'=>'Alice'],
['id'=>2, 'name'=>'Bob'],
['id'=>3, 'name'=>'Charlie'],
];
shuffle($users); // 直接打亂順序,子陣列結構不變
?>
<?php
// 固定種子 → 固定順序
mt_srand(12345);
$arr = range(1, 10);
shuffle($arr); // 每次結果相同
?>
⚠️ mt_srand() 影響全域隨機狀態,**生產環境嚴禁使用**,僅限單元測試。
shuffle() 為 O(n),記憶體原地操作,效能極佳。uksort($arr, fn() => random_int(-1, 1))(PHP 7+)或 Fisher-Yates 手寫版。shuffle() 使用 Mersenne Twister,**不適用於加密用途**,需自行實作 random_int() 版本。shuffle() 是處理陣列隨機化的首選工具,記住**「數字鍵重置、字串鍵保留、原地修改」**三大特性,即可避開 90% 的坑。