首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP shuffle() 函式深度解析:陣列隨機重排與鍵值重置機制

     編輯:PHP 相關知識

函式簽名與核心行為

bool shuffle ( array &$array )
  • 原地修改: 以參考傳遞直接打亂原陣列,回傳布林值表示成功與否。
  • 鍵名重置: 執行後所有鍵名會重新編為 0,1,2... 連續數字索引,原有關聯鍵名會遺失。
  • 隨機演算法: PHP 7.1+ 採用 Mersenne Twister,分布均勻且效能佳。

實戰範例與輸出觀察

<?php
$a = [
    '1' => 'Xiao',
    '2' => 'Da',
    '3' => 'Zuo',
    '4' => 'You'
];
echo "原始陣列:<br/>";
print_r($a);

shuffle($a);

echo "<br/>打亂後:<br/>";
print_r($a);
?>

典型輸出:

原始陣列:
Array ( [1] => Xiao [2] => Da [3] => Zuo [4] => You )
打亂後:
Array ( [0] => Da [1] => Xiao [2] => You [3] => Zuo )

觀察重點:
1. 值的順序隨機化
2. 鍵名從字串 '1'..'4' 變為整數 0..3

常見陷阱與替代方案

需求shuffle() 問題解決方案
保留關聯鍵名 鍵名重置為數字索引 uksort($arr, fn() => rand(-1,1)) 或自訂 Fisher-Yates 保留鍵名版本
可重現的隨機序列 無法指定種子 PHP 7.1+ 內建隨機器已自動播種;舊版可用 srand($seed) 配合 shuffle
多維陣列只打亂第一層 同樣適用,但子陣列順序不變 若需深層打亂需自行遞歸

效能與適用場景

  • 時間複雜度: O(n),百萬筆資料約 0.1 秒內完成。
  • 適用: 抽獎、隨機推薦、測試資料打亂、驗證碼字元順序。
  • 不適用: 需保留鍵值對應的關聯陣列、需加密安全隨機的場景(改用 random_int + 自訂演算法)。

總結

shuffle() 是 PHP 陣列隨機化的首選工具,簡潔高效。只需牢記「鍵名會重置」這一特性,即可避開最常見的坑。若專案需保留鍵名,請採用 uksort 搭配隨機比較函式,或自行實作保留鍵名的 Fisher-Yates 演算法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved