去除陣列重複值有兩種常見做法:手寫 foreach + in_array 或內建 array_unique()。本文透過實際測試比較兩者在不同資料量、重複率下的效能表現。
$arrF = $arrS = [];
$intTotal = 10000; // 總筆數
$intRand = 100; // 隨機範圍(越小重複率越高)
for ($i = 0; $i < $intTotal; $i++) {
$arrF[] = rand(1, $intRand);
$arrS[] = rand(1, $intRand);
}
$arrT = array_merge($arrF, $arrS); // 待去重陣列
// 方法 1:foreach + in_array
$arrRF = [];
$start = microtime(true);
foreach ($arrT as $v) {
if (in_array($v, $arrRF)) continue;
$arrRF[] = $v;
}
$time1 = microtime(true) - $start;
// 方法 2:array_unique
$start = microtime(true);
$arrRS = array_unique($arrT);
$time2 = microtime(true) - $start;
echo "foreach + in_array: {$time1} 秒\n";
echo "array_unique: {$time2} 秒\n";
| 資料量 | 隨機範圍 (intRand) | 重複率 | 較快方法 |
|---|---|---|---|
| 1,000 以下 | 任意 | 低~高 | 差異極小 |
| 10,000 | 100 | 中等 | array_unique 勝出 |
| 10,000 | 10 | 極高 | 兩者持平 |
| 100,000+ | 1,000 | 低 | array_unique 明顯更快 |
array_unique 程式碼更簡潔。array_unique 內部採用雜湊表,時間複雜度接近 O(n),遠優於 O(n²) 的 in_array。array_unique 會保留原鍵名,若需重設索引可搭配 array_values()。array_unique 不支援,需自行序列化比較或用 array_map('serialize', $arr) 處理。
最佳實務:預設優先使用 array_unique(),除非有特殊邏輯(如比較物件、多維陣列)才考慮自寫迴圈。