內置 array_unique() 僅支持 字符串/數值 值的去重。當數組元素是 數組 或 對象 時會拋出警告並失效。
<?php
/**
* 多維數組/對象去重
* @param array $arr 待去重數組
* @param bool $reserveKey 是否保留原鍵名
* @return array 去重後數組
*/
function m_ArrayUnique($arr, $reserveKey = false) {
if (!is_array($arr) || empty($arr)) return $arr;
$tmpArr = [];
foreach ($arr as $key => $value) {
// 序列化統一為字符串,保留類型結構
$tmpArr[$key] = serialize($value);
}
// 利用內置去重
$tmpArr = array_unique($tmpArr);
// 反序列化還原
$result = [];
foreach ($tmpArr as $key => $value) {
if ($reserveKey) {
$result[$key] = unserialize($value);
} else {
$result[] = unserialize($value); // 重建索引
}
}
return $result;
}
a:2:{i:0;s:1:"a";i:1;s:1:"b";}array_unique 在字符串層面高效去重。$data = [
['id' => 1, 'name' => 'A'],
['id' => 2, 'name' => 'B'],
['id' => 1, 'name' => 'A'], // 重複
(object)['id' => 3, 'name' => 'C'],
(object)['id' => 3, 'name' => 'C'], // 重複對象
];
$unique = m_ArrayUnique($data, true); // 保留鍵名
print_r($unique);
/*
Array
(
[0] => Array ( [id] => 1 [name] => A )
[1] => Array ( [id] => 2 [name] => B )
[3] => stdClass Object ( [id] => 3 [name] => C )
)
*/
spl_object_hash)優化。