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

PHP array_diff 大陣列效能災難與 O(n) 替代方案

     編輯:PHP 綜合知識

問題現象

PHP 5.2.6+ `array_diff()` 處理大陣列(萬筆以上)極其緩慢,甚至超時。根因在於內部實作為 O(n²) 雙重迴圈比較。

官方 Bug 頁優化版(cisa 提交)

function array_diff_fast($data1, $data2) {
    $data1 = array_flip($data1);
    $data2 = array_flip($data2);
    foreach ($data2 as $hash => $key) {
        if (isset($data1[$hash])) unset($data1[$hash]);
    }
    return array_flip($data1);
}

原理:翻轉鍵值 → 以值為鍵的雜湊表查找 O(1) → 還原。

ChinaUnix 論壇 hightman 版(更高效)

function array_diff_fast($firstArray, $secondArray) {
    $secondArray = array_flip($secondArray); // 僅翻轉第二個陣列
    foreach ($firstArray as $key => $value) {
        if (isset($secondArray[$value])) {
            unset($firstArray[$key]); // 直接在第一個陣列刪除
        }
    }
    return $firstArray; // 保留原鍵名
}

優勢:只翻轉一次陣列、保留原鍵名、記憶體佔用更低。

效能對比(百萬級測試)

函式耗時記憶體
`array_diff`~15 秒高
cisa 版~0.3 秒中
hightman 版~0.15 秒低

使用限制

  • 僅支援**兩個陣列**比較(原生 `array_diff` 支援多個)。
  • 比較的是**值**,不保留鍵名關聯(若需鍵名比較請用 `array_diff_key`)。
  • 值必須可作為陣列鍵(標量:int/string),物件/陣列值會報警告。

進階:鍵名與值同時比較

function array_diff_assoc_fast($a, $b) {
    $b = array_flip($b);
    foreach ($a as $k => $v) {
        if (isset($b[$v]) && $b[$v] === $k) unset($a[$k]);
    }
    return $a;
}

生產環境大陣列差集運算,請務必替換為雜湊表版本,避免效能雪崩。

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