內建函式: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+)
| 旗標 | 比較行為 |
| `SORT_STRING` (預設) | 字串比較 |
| `SORT_NUMERIC` | 數值比較 |
| `SORT_REGULAR` | 不轉型,型別敏感比較 (`1 !== '1'`) |
| `SORT_LOCALE_STRING` | 依當前 locale 字串比較 |
多維陣列/物件去重策略
<?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` 是相對平衡的方案。
- 上一篇文章: PHP GD 繪製 3D 長條統計圖類:座標計算、多資料系列、現代 Chart.js/ECharts 替代方案
- 下一篇文章: PHP 取得用戶真實 IP:代理穿透、CDN 頭部、可信代理驗證與安全最佳實踐
Copyright ©
程式碼之家 All Rights Reserved