HOWTO · PHP
在 PHP 中從陣列中刪除重複的值
本文介紹瞭如何在 PHP 中從一個陣列中刪除重複的值。它包括 array_unique()函式。
本頁內容
若要移除 PHP 陣列中的重複值,請將陣列傳入 array_unique()。函式會回傳一個陣列,其中每組依比較結果視為相等的值只保留第一個。結果也會保留這些值原本的鍵,因此移除重複值後,數字索引不一定會連續。
使用 array_unique() 移除重複值
此函式接受一個陣列,也可選擇指定比較旗標。基本用法是 array_unique($array)。例如,若清單包含 "red", "blue", "red",回傳的清單會保留第一個 "red" 和 "blue"。原陣列不會排序,保留值的順序也不會改變。若要繼續使用去重後的版本,請將回傳的陣列指定給變數:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
$colors = ["red", "blue", "red", "green", "blue"];
$uniqueColors = array_unique($colors);
了解會保留哪個值與鍵
當值依所選旗標比較後相等時,array_unique() 會保留先遇到的值,並移除後續相符的值。在索引陣列中,移除項目後,鍵可能會出現間隔。在關聯陣列中,每個保留值仍會帶有原本的鍵。若鍵用來識別記錄或名稱,保留鍵就很有用;但如果程式預期結果的索引是 0, 1, 2, ...,這種行為可能會讓人意外。
此函式會移除重複值,不會依值或鍵排序。如果輸出順序很重要,請記得保留值仍維持原本的相對順序。選擇比較旗標時,應依照哪些值應視為相等來決定,而不是依照想要的顯示順序。
選擇比較旗標
選用 $flags 引數可指定比較模式。預設值 SORT_STRING 會將值視為字串來比較。SORT_REGULAR 使用 PHP 一般的比較方式,SORT_NUMERIC 以數值方式比較,而 SORT_LOCALE_STRING 則依目前的地區設定比較字串。旗標會改變哪些值被視為重複項目,但不會排序回傳的陣列。因此,混合型別的值可能會因旗標不同而得到不同的去重結果。請選擇符合資料含義的模式,並避免以為數值比較會重新排列值。
需要時重新編排索引
如果後續程式需要鍵值連續的數字索引清單,請將去重後的結果傳給 array_values()。這會建立一個新的數字索引陣列,同時保留原有保留值的順序。若鍵具有意義,例如商品 ID 或標籤,就應保留它們;只有在使用端需要一般清單時才重新編排索引。重新編排索引是獨立步驟,array_unique() 不會自動執行。
使用 PHP 範例檢查結果
執行以下完整範例,查看保留的值以及重新編排索引的效果。範例程式碼與輸出中的標籤維持英文:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
$items = ["first" => "pear", "second" => "plum", "third" => "pear", "fourth" => "lime"];
$uniqueItems = array_unique($items);
$listItems = array_values($uniqueItems);
echo "Unique values with original keys:\n";
print_r($uniqueItems);
echo "Same values with consecutive keys:\n";
print_r($listItems);
第一個結果會保留 first、second 和 fourth 這些鍵;後面重複的 pear 項目會被移除。重新編排索引後,結果包含相同的值,順序也相同,但鍵會改為連續的數字。了解這項差異,有助於判斷何時應保留記錄鍵,何時應準備一份供預期使用一般數字索引的程式使用的清單。