array_flip() 交換陣列鍵值,利用「鍵名唯一」特性可高效去重,效能約為 array_unique() 的 5 倍。本文解析原理與使用技巧。
$arr = array(/* 萬筆資料,含重複 */);
$arr = array_flip(array_flip($arr)); // 去重完成
array_flip($arr):將值轉為鍵,重複值導致鍵衝突,**後出現的覆蓋先出現的**(保留最後一個)。array_flip():將鍵值再交換回來,得到去重後的陣列(索引重排為 0,1,2...)。$arr1 = array("age" => 30, "name" => "腳本之家", "age" => 20);
// 實際等同於
$arr1 = array("name" => "腳本之家", "age" => 20); // 重複鍵 age 保留最後值
$arr2 = array_flip($arr1);
// $arr2 = array(30 => "age", "腳本之家" => "name") -> 但 30 被覆蓋
// 實際:$arr2 = array("腳本之家" => "name", 20 => "age")
$arr3 = array_flip($arr2);
// $arr3 = array("name" => "腳本之家", "age" => 20) // 去重完成
| 函數 | 時間複雜度 | 實測萬筆耗時 | 備註 |
|---|---|---|---|
| array_flip x2 | O(n) | ~2ms | 利用 HashTable 鍵唯一性,單遍歷 |
| array_unique | O(n log n) 或 O(n²) | ~10ms | 內部排序/比較,保留首次出現 |
array_unique 或先 array_reverse 再雙重 flip。善用 array_flip 雙重翻轉技巧,能以極簡代碼獲得極致去重效能。