<?php
$a = ["a" => "Cat", "b" => "Dog", "c" => "Cat"];
$result = array_unique($a);
print_r($result);
/*
Array
(
[a] => Cat
[b] => Dog
)
*/
?>
==):"1" == 1 視為重複。<?php
$arr = [2, "2", 3, "3", 1];
// SORT_REGULAR (預設):一般比較,不轉型
print_r(array_unique($arr, SORT_REGULAR)); // [2, 3, 1] ("2" 與 2 不同)
// SORT_NUMERIC:數值比較
print_r(array_unique($arr, SORT_NUMERIC)); // [2, 3, 1] ("2" == 2)
// SORT_STRING:字串比較
print_r(array_unique($arr, SORT_STRING)); // [2, "2", 3, "3", 1] (全不同)
// SORT_LOCALE_STRING:依當地語系字串比較
// print_r(array_unique($arr, SORT_LOCALE_STRING));
?>
<?php
$a = ["a" => "Cat", "b" => "Dog", "c" => "Cat"];
$result = array_values(array_unique($a)); // array_values() 重新索引
print_r($result);
/*
Array
(
[0] => Cat
[1] => Dog
)
*/
?>
array_unique() 只能處理一維陣列。多維陣列需自行實作:
<?php
function arrayUniqueMulti($arr) {
// 序列化每個子陣列當作唯一鍵
$serialized = array_map('serialize', $arr);
$unique = array_unique($serialized);
return array_map('unserialize', $unique);
}
$data = [
['id' => 1, 'name' => 'A'],
['id' => 2, 'name' => 'B'],
['id' => 1, 'name' => 'A'], // 重複
];
print_r(arrayUniqueMulti($data));
/*
Array
(
[0] => Array ( [id] => 1 [name] => A )
[1] => Array ( [id] => 2 [name] => B )
)
*/
?>
array_unique() 內部需排序比較,時間複雜度約 O(n log n),大陣列 (10萬+) 可能較慢。array_flip() 兩次 (僅適用純量值陣列,且值需能作為鍵名):
$unique = array_flip(array_flip($arr)); // 極快,但會丟失原鍵名、重新索引、且值必須為 int/string
DISTINCT 或應用層快取。PHP 內建無嚴格模式旗標。需嚴格比較 (型別也要相同) 時:
<?php
function array_unique_strict($arr) {
$seen = [];
return array_filter($arr, function($v) use (&$seen) {
$key = is_array($v) ? serialize($v) : (gettype($v) . ':' . $v);
if (isset($seen[$key])) return false;
$seen[$key] = true;
return true;
});
}
$arr = [1, "1", 2, "2", true, false];
print_r(array_unique_strict($arr));
// [1, "1", 2, "2", true, false] 全部保留 (型別不同)
?>
| 需求 | 方法 |
|---|---|
| 一維陣列基本去重 | array_unique($arr) |
| 去重並重新索引 | array_values(array_unique($arr)) |
| 數值比較去重 (1 == "1") | array_unique($arr, SORT_NUMERIC) |
| 字串比較去重 ("1" !== "1") | array_unique($arr, SORT_STRING) |
| 多維陣列去重 | array_map('unserialize', array_unique(array_map('serialize', $arr))) |
| 超大陣列純量值極速去重 | array_flip(array_flip($arr)) (副作用:重新索引、丟鍵名) |
| 嚴格型別去重 (1 !== "1") | 自訂 array_filter + 序列化/型別標記 |