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

PHP 數組隨機排序:shuffle() 函數詳解與進階應用

     編輯:PHP 相關知識

基礎用法

<?php
$cards = ['A','2','3','4','5','6','7','8','9','10','J','Q','K'];
shuffle($cards); // 原地打亂,返回 bool
print_r($cards);
/* 示例輸出:
Array
(
    [0] => Q
    [1] => 3
    [2] => 5
    [3] => 2
    [4] => 10
    [5] => 9
    [6] => K
    [7] => 4
    [8] => J
    [9] => 6
    [10] => 7
    [11] => 8
    [12] => A
)
*/
?>

特點:
• 修改原數組 (引用傳遞)
• 重新索引數字鍵 (0,1,2...)
• 字符串鍵保持不變
• 使用 Mersenne Twister 偽隨機數生成器

常見陷阱

<?php
// ❌ 錯誤:shuffle 返回 bool,不是新數組
$shuffled = shuffle($arr); // $shuffled = true

// ✅ 正確:先複製再打亂 (保留原數組)
$copy = $arr;
shuffle($copy);

// ❌ 錯誤:關聯數組字符串鍵會保留,但值順序打亂
$assoc = ['a'=>1, 'b'=>2, 'c'=>3];
shuffle($assoc); // 鍵 a,b,c 不變,值隨機重新分配
// 如需打亂鍵值對,需自定義
?>

進階:保持鍵值關係的隨機排序

<?php
function shuffleAssoc(array $array): array {
    $keys = array_keys($array);
    shuffle($keys);
    $result = [];
    foreach ($keys as $key) {
        $result[$key] = $array[$key];
    }
    return $result;
}

$assoc = ['id'=>1, 'name'=>'PHP', 'ver'=>8.2];
$shuffled = shuffleAssoc($assoc);
// 可能輸出: ['name'=>'PHP', 'id'=>1, 'ver'=>8.2] (鍵值對整體移動)
?>

進階:加權隨機排序 (抽獎、廣告輪播)

<?php
function weightedShuffle(array $items, array $weights): array {
    // $items = ['A','B','C']; $weights = [10, 30, 60];
    $weighted = [];
    foreach ($items as $i => $item) {
        // 權重越大,複製份數越多
        $weighted = array_merge($weighted, array_fill(0, $weights[$i], $item));
    }
    shuffle($weighted);
    return $weighted; // 可能包含重複,按需去重或直接用於抽獎池
}

// 洗牌算法:Fisher-Yates (shuffle 內部實現)
function fisherYatesShuffle(array &$array): void {
    for ($i = count($array) - 1; $i > 0; $i--) {
        $j = mt_rand(0, $i);
        [$array[$i], $array[$j]] = [$array[$j], $array[$i]];
    }
}
?>

進階:可復現的隨機排序 (測試、分頁、A/B 測試)

<?php
function seededShuffle(array $array, int $seed): array {
    $copy = $array;
    mt_srand($seed); // 設置種子
    shuffle($copy);
    mt_srand(); // 恢復隨機種子 (PHP 7.1+ 自動)
    return $copy;
}

$data = range(1, 10);
$page1 = seededShuffle($data, 12345); // 固定種子,結果固定
$page2 = seededShuffle($data, 12346); // 不同種子,不同結果
// 同一用戶、同一會話使用固定種子,保證分頁順序一致
?>

性能對比 (100萬元素)

方法耗時內存特點
shuffle()~120ms原地C 級實現,最快
Fisher-Yates PHP 實現~800ms原地純 PHP,較慢
array_rand + 重組~200ms雙倍不修改原數組

應用場景

  1. 洗牌遊戲:撲克、麻將、隨機地圖生成
  2. 問卷選項隨機順序:避免位置偏差
  3. 負載均衡:服務器列表隨機選取
  4. 數據增強:訓練數據打亂
  5. 抽獎系統:結合加權隨機
  6. A/B 測試分桶:用戶 ID 取模或種子洗牌

總結

`shuffle()` 是 PHP 內置的高性能數組隨機排序函數,適用於數字索引數組原地打亂。關聯數組需自定義保持鍵值關係。進階場景涵蓋加權隨機、可復現種子、大數據性能優化。理解其行為邊界 (返回值、鍵名處理、偽隨機本質) 能避免常見 Bug。

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