陣列去重是高頻需求。本文對比四種方法的原理、效能、適用場景與鍵名保留差異。
array_unique()(推薦通用)$input = ["a" => "green", "red", "b" => "green", "blue", "red"]; $result = array_unique($input); print_r($result);
Array
(
[a] => green
[0] => red
[1] => blue
)
(string)$val,故 1 與 "1" 視為相同。array_values()。array_flip() 雙重翻轉(保留最後)$arr = ["a" => "a1", "b" => "b1", "c" => "a2", "d" => "a1"]; $flipped = array_flip($arr); // 值變鍵,重複值保留最後一個鍵 $unique = array_flip($flipped); // 翻回,鍵值對調 print_r($unique);
Array
(
[a1] => d
[b1] => b
[a2] => c
)
array_unique 保留第一個)。in_array()(完全控制)function array_unique_manual($arr) {
$result = [];
foreach ($arr as $key => $val) {
if (!in_array($val, $result, true)) { // 嚴格模式
$result[$key] = $val;
}
}
return $result;
}
O(n²) 複雜度,大陣列極慢,僅適用小陣列或特殊比較需求。function array_unique_fast($arr) {
return array_keys(array_flip($arr)); // 或 array_flip(array_flip($arr)) 保留鍵名
}
array_flip 以值為鍵自動去重(保留最後),array_keys 取出鍵即為唯一值列表。| 方法 | 耗時 | 記憶體 | 保留鍵名 | 保留順序 |
|---|---|---|---|---|
array_unique() | ~12ms | 低 | 首次 | 首次出現順序 |
array_flip x2 | ~3ms | 低 | 最後 | 最後出現順序 |
| 手動循環 | ~2500ms | 高 | 首次 | 首次出現順序 |
array_keys(flip) | ~2ms | 最低 | 無 | 值排序順序 |
內建函數僅支援一維。多維需序列化比較:
function array_unique_multidimensional($arr) {
$serialized = array_map('serialize', $arr);
$unique = array_unique($serialized);
return array_map('unserialize', $unique);
}
或使用 spl_object_hash() 處理物件陣列。
array_unique()array_flip(array_flip($arr))array_keys(array_flip($arr))array_udiff() + 回調