在 PHP 開發中,移除陣列重複值並保留唯一元素 是常見需求。雖然內建 array_unique() 可直接達成,但了解其底層邏輯與替代方案,有助於在大量資料或多維陣列場景下做出最佳選擇。
array_unique()(推薦)<?php
$arr = ['aa', 'bb', 'aa', 3, 4, 5, 5, 5, 5, 'bc'];
$result = array_unique($arr);
print_r($result);
// 輸出: Array ( [0] => aa [1] => bb [3] => 3 [4] => 4 [5] => 5 [9] => bc )
優點:語法簡潔、保留原鍵名、C 底層實作效能佳。
注意:預設使用字串比較(SORT_STRING),數值 1 與字串 '1' 視為相同;若需嚴格型別比較,可傳入 SORT_REGULAR 旗標。
<?php
function formatArray($array) {
sort($array); // 重新索引並排序
$temp = '';
$result = [];
$j = 0;
for ($i = 0; $i < count($array); $i++) {
if ($array[$i] !== $temp) {
$result[$j++] = $array[$i];
}
$temp = $array[$i];
}
return $result;
}
$arr = ['aa', 'bb', 'aa', 3, 4, 5, 5, 5, 5, 'bc'];
print_r(formatArray($arr));
此法先排序再刪除相鄰重複值,適合理解去重邏輯,但會改變原陣列順序與鍵名,實務上較少直接使用。
針對多維陣列,array_unique() 會因無法直接比較陣列而拋出警告。常見做法:
<?php
// 將子陣列序列化為字串去重,再反序列化
$unique = array_map('unserialize', array_unique(array_map('serialize', $multiArray)));
// 或使用 array_column 搭配鍵名去重(PHP 5.5+)
$unique = array_values(array_unique($multiArray, SORT_REGULAR)); // 需自行實作比較邏輯
array_unique()。array_flip() 兩次(鍵值互換)去重,速度更快但會重設數字鍵:$arr = array_flip(array_flip($arr));array_unique() 或手動遍歷。日常開發請優先使用 array_unique(),僅在特殊需求(如多維陣列、嚴格型別、極致效能)下才採用客製化演算法。理解各方法特性,才能寫出健壯且高效的程式碼。