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

PHP 陣列去重:array_unique 內建函式、保留鍵名、多維陣列去重與效能對比

     編輯:PHP 相關知識

內建函式:array_unique (首選)

<?php
$arr = ['a', 'b', 'a', 'c', 'b', 'd'];
$unique = array_unique($arr);
// 結果:['a', 'b', 'c', 'd'] (保留首次出現的鍵名 0,1,3,5)
// 注意:鍵名**不重建**,如需連續索引用 array_values()
$reindexed = array_values($unique); // [0=>'a', 1=>'b', 2=>'c', 3=>'d']
?>

參數模式 (PHP 7.2+)

多維陣列/物件去重策略

<?php
// 1. 序列化去重 (簡單、序列化開銷大)
function arrayUniqueMulti(array $arr): array {
    $serialized = array_map('serialize', $arr);
    $unique = array_unique($serialized);
    return array_map('unserialize', $unique);
}

// 2. JSON 編碼去重 (可讀、不支援 resource/closure)
function arrayUniqueMultiJson(array $arr): array {
    $encoded = array_map(fn($v) => json_encode($v, JSON_UNESCAPED_UNICODE|JSON_SORT_KEYS), $arr);
    $unique = array_unique($encoded);
    return array_map('json_decode', $unique, [true]); // 解碼為關聯陣列
}

// 3. 自訂比較函式 (PHP 8.0+ array_udiff + 閉包)
function arrayUniqueCustom(array $arr, callable $comparator): array {
    return array_values(array_udiff($arr, [], $comparator));
}

// 使用:比較 id 欄位
$users = [
    ['id'=>1, 'name'=>'A'],
    ['id'=>2, 'name'=>'B'],
    ['id'=>1, 'name'=>'A dup'],
];
$uniqueUsers = arrayUniqueCustom($users, fn($a,$b) => $a['id'] <=> $b['id']);
// 保留首個 id=1
?>

效能對比 (參考,10 萬元素、10% 重複)

array_unique (SORT_REGULAR)     : ~0.015s  (C 層優化,最快)
array_unique (SORT_STRING)      : ~0.018s
serialize + array_unique        : ~0.120s  (序列化開銷大)
json_encode + array_unique      : ~0.090s
array_udiff 自訂比較            : ~0.450s  (使用者函式呼叫開銷極大)

**結論**:單維標量陣列**直接用 `array_unique`**。多維/物件優先考慮**資料庫層面 `DISTINCT`/GROUP BY** 或 **Key-Value 結構重設計 (以 ID 為 Key)**,避免 PHP 層面高複雜度去重。

保留鍵名 vs 重建索引

$arr = [2=>'a', 5=>'b', 7=>'a'];
$u = array_unique($arr); // [2=>'a', 5=>'b'] 保留原鍵
$r = array_values($u);   // [0=>'a', 1=>'b'] 重建 0..n
?>

總結

`array_unique` 是 PHP 陣列去重的標準工具,**C 層實現、效能極佳、支援多種比較模式**。多維陣列去重請優先在資料來源 (SQL/Redis) 解決,或重構資料結構以唯一識別碼為鍵。若必須在 PHP 層處理,`json_encode(JSON_SORT_KEYS)` + `array_unique` 是相對平衡的方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
旗標比較行為
`SORT_STRING` (預設)字串比較
`SORT_NUMERIC`數值比較
`SORT_REGULAR`不轉型,型別敏感比較 (`1 !== '1'`)
`SORT_LOCALE_STRING`依當前 locale 字串比較