php数组去重首选array_unique(),它保留首次出现项并默认松散比较;关联数组去重后需array_values()重排键名;多维数组需降维(如array_column+array_intersect_key)或序列化处理。

PHP数组去重用 array_unique() 最直接
绝大多数场景下,array_unique() 就是你要找的函数。它会保留每个值第一次出现的位置,删掉后续重复项,返回新数组。
注意它默认只做「松散比较」(即 "1" 和 1 被视为相同),如果数组含混合类型且需严格区分,得加第二个参数:ARRAY_FILTER_USE_BOTH 不行,正确的是 SORT_REGULAR(默认)、SORT_NUMERIC 或 SORT_STRING —— 但这些只影响排序行为,不改变比较逻辑;真要严格类型敏感,得自己写循环或用 array_values() + array_keys() 配合 === 判断。
常见错误:直接对关联数组去重后没重置键名,导致键变成不连续数字或保留原键造成混淆:
$arr = ['a' => 1, 'b' => 2, 'c' => 1]; var_dump(array_unique($arr)); // 键仍为 'a', 'b',不是 0,1 // 如需数字索引,补一句:array_values(array_unique($arr))
多维数组去重不能直接用 array_unique()
array_unique() 对多维数组无效,内部把子数组当对象处理,而 PHP 中数组不能作为 hash key,所以所有子数组会被当作相同值(PHP 7+ 会报 Warning: array_unique(): Array return type is not supported yet)。
实操建议:
- 若子数组结构固定(如都含
id字段),用array_column()提取该列,再结合array_intersect_key()去重 - 若需完全按内容比对,先用
json_encode()转成字符串去重,再json_decode()回来(注意浮点精度、对象转数组等副作用) - 更稳的方式是手动遍历,用
serialize()作临时 hash key(兼容资源、递归结构,但性能略低)
示例(基于 id 去重):
$data = [['id'=>1,'name'=>'A'], ['id'=>2,'name'=>'B'], ['id'=>1,'name'=>'C']]; $ids = array_column($data, 'id'); $unique = array_intersect_key($data, array_unique($ids));
去重时要注意键名是否要保留
去重逻辑和键名处理是两件事:array_unique() 默认保留原始键名,这对关联配置类数组很重要;但对索引数组,往往需要连续数字键。
关键判断点:
- 如果你后续要用
for ($i=0; $i<count> 遍历,必须用 <code>array_values()重排键 - 如果数组是用
foreach ($arr as $k => $v),且业务依赖键名(比如键是用户ID),那别动键名 -
array_unique()对字符串键和数字键一视同仁,不会自动转成数字索引
性能提示:对超大数组(>10万项),array_unique() 底层用哈希表,O(n);但若配合 array_values(),会额外触发一次复制,可酌情合并操作。
遇到 Notice: Array to string conversion 怎么办
这个错误通常出现在你误把整个数组传给了期望字符串的函数,比如在 echo、print_r() 漏写、或在 array_unique() 前不小心做了隐式字符串拼接(如 'prefix_' . $arr)。
排查步骤:
- 检查报错行附近是否对数组用了
.、==、===或输出语句 - 确认传给
array_unique()的变量确实是数组:is_array($arr),避免传入null或对象 - 特别留意从 JSON 解析或数据库 fetch 出来的数据,有时嵌套结构意外变深,你以为是二维,其实是三维
一句话定位:加一句 var_dump(gettype($arr), count($arr)); 在去重前,比猜快得多。
多维去重没有银弹,array_unique() 失效时,优先考虑降维条件(比如只按某字段去重),而不是硬编码全量序列化 —— 后者在含浮点数、NaN、资源或闭包时会出问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











