
array_unique 为什么有时去不掉重复值?
因为 array_unique 默认用 字符串比较,遇到数字和字符串混排(比如 0 和 "0")、浮点数精度差异、或对象/数组等不可序列化类型时,会误判为“不同”而保留重复项。
常见错误现象:array_unique([0, "0", 0.0]) 返回全部三个元素;array_unique([1.0, 1]) 也可能不合并。
- 使用前先统一数据类型:整数就全转
(int),字符串就全(string) - 对浮点数去重,建议先四舍五入到固定小数位再处理,比如
round($val, 2) - 含嵌套数组或对象的结构,
array_unique直接报 Warning 并返回原数组——它根本不支持
关联键名丢失后怎么恢复?
array_unique 会重置数字键(0,1,2...),但保留字符串键。如果原始数组是索引数组且你依赖下标顺序(比如对应数据库 ID 或前端渲染顺序),直接用会导致错位。
典型场景:从 MySQL 查询出的 ['id' => 123, 'name' => 'a'] 列表去重后,想保持原始位置关系。
立即学习“PHP免费学习笔记(深入)”;
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
- 加
SORT_REGULAR参数没用,它只控制比较方式,不影响键名 - 安全做法是用
array_values(array_unique($arr))显式重排,或用array_keys+array_flip组合保序(仅限一维纯值) - 更稳妥的写法:
$unique = array_intersect_key($arr, array_unique(array_map('strval', $arr)))—— 把值转字符串比较,同时用array_intersect_key拉回原键
大数据量下性能卡顿怎么办?
array_unique 时间复杂度是 O(n²),PHP 内部用嵌套循环比对,当数组超 5000 项时延迟明显,尤其在 PHP 7.4 之前版本。
真实使用场景:日志分析脚本读取上万行 IP 地址去重,或导出报表前清洗用户 ID 列表。
- 优先用
array_flip(array_flip($arr))替代:利用键唯一性,速度通常快 3–5 倍,但只适用于一维、值可作键(即不能是数组/对象/NULL) - 若含非标量值,改用
foreach+isset手动去重,显式控制逻辑,避免隐式类型转换干扰 - PHP 8.1+ 可考虑
array_unique($arr, SORT_STRING)配合array_values,字符串模式在某些情况下比默认模式略快
JSON 字符串内容相同但格式不同,能去重吗?
不能。array_unique 不解析 JSON,'{"a":1}' 和 '{ "a" : 1 }' 被视为两个完全不同的字符串。
常见于 API 返回体去重、前端传来的配置项合并等场景。
- 先用
json_decode($str, true)解析,再用json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)标准化输出,最后去重 - 注意空值和布尔值:
null、true、false在 JSON 中有明确表示,但 PHP 数组里可能被转成""或1,需提前对齐 - 别忘了异常处理:
json_last_error()必须检查,无效 JSON 会让整个去重流程中断










