首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 刪除陣列重複元素的四種高效方法

     編輯:PHP 相關知識

PHP 刪除陣列重複元素的四種高效方法

陣列去重是高頻需求。本文對比四種方法的原理、效能、適用場景與鍵名保留差異。

方法一:內建 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" 視為相同。
  • 效能:C 級實現,大陣列(>10萬)仍優於用戶態循環。
  • 注意:不重新索引數字鍵,如需連續索引需 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;
}
  • 優勢:可自定義比較邏輯(嚴格/非嚴格、物件 ID、回調函數)。
  • 劣勢:O(n²) 複雜度,大陣列極慢,僅適用小陣列或特殊比較需求。

方法四:鍵名為值的陣列合併(極速,限數字/字串值)

function array_unique_fast($arr) {
    return array_keys(array_flip($arr)); // 或 array_flip(array_flip($arr)) 保留鍵名
}
  • 原理:array_flip 以值為鍵自動去重(保留最後),array_keys 取出鍵即為唯一值列表。
  • 極速:全 C 級操作,百萬級陣列毫秒級完成。
  • 代價:丟失原鍵名,值必須為合法鍵類型。

效能對比(10 萬元素陣列)

方法耗時記憶體保留鍵名保留順序
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() + 回調
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved