PHP 5.2.6+ `array_diff()` 處理大陣列(萬筆以上)極其緩慢,甚至超時。根因在於內部實作為 O(n²) 雙重迴圈比較。
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) → 還原。
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 秒 | 低 |
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;
}
生產環境大陣列差集運算,請務必替換為雜湊表版本,避免效能雪崩。