PHP怎么用array_unique去重数组元素【方法】

array_unique保留原始键名且不重排索引,需用array_values重置;默认松散比较易误删,多维数组不递归;不支持对象/资源;大数据量时性能较差,手写isset去重更快。array_unique 会保留原始键名,不是重排索引直接用 array_unique 去重后,数组的数字键可能不连续,比如 0 =\> 'a', 2 =\> 'b', 5 =\> 'a' 去重后变成 0 =\> 'a', 2 =\> 'b',而不是你想要的 0 =\> 'a', 1 =\> 'b'。如果后续要遍历、JSON 输出或传给前端,建议手动重置键:array_values(array_unique(arr))array_unique 对字符串和整数默认按「松散比较」处理,'1' 和 1 会被视为相同 ------ 这在混合类型数组里容易误删它不递归,多维数组每个子数组被当做一个整体比较,不会深入比对内部元素去重时要注意 sort_flags 参数的实际效果array_unique 的第二个参数控制比较方式,但只影响「排序行为」,不影响去重逻辑本身;PHP 7.2+ 才支持该参数,低版本传了也无效。SORT_STRING(默认):按字符串规则比较,0 和 '0' 相同SORT_REGULAR:按类型+值严格比较,0 !== '0',能避免类型混淆导致的误去重SORT_NUMERIC:把所有值转为数字再比,'1'、1、1.0 全算一样 ------ 用前确认业务是否允许这种隐式转换遇到对象或资源类型会报 Warning 并跳过array_unique 不支持对象、资源、闭包等不可序列化类型,遇到时会触发 Warning: array_unique(): Array contains elements that cannot be compared,并把它们原样保留在结果中(不去重也不报错退出)。若数组里混有对象,先用 array_map 提取可比字段,例如:array_unique(array_column(arr, 'id'))想彻底过滤掉非标量值,得自己写循环 + is_scalar() 判断注意:即使对象实现了 __toString(),也不会被自动调用用于比较大数据量下性能明显下降,别无脑用array_unique 底层是哈希去重,时间复杂度接近 O(n),但 PHP 实现中会做多次内部拷贝和类型判断,实测 10 万以上字符串元素时比手写 foreach + isset(seen$v) 慢 2--3 倍。 Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

相关推荐
运维小斌几秒前
麒麟 V10 ARM64 离线部署 OceanBase:8 步实施手册
linux·数据库·oceanbase·麒麟
小小张说故事5 分钟前
Python 的 list append 为什么是均摊 O(1)?拆开过度分配那张表,看容量翻倍背后的暗账
python
benjiangliu7 分钟前
恩培趣味计算机视觉-01-conda环境和Python库
开发语言·python·conda
ZhengEnCi12 分钟前
用 YOLOv8n + 自研二分类模型做课堂行为识别:从 9000 张标注数据到 Flask 全栈落地
pytorch·python·计算机视觉
成为深度学习高手22 分钟前
xLSTM-Mixer:用标量记忆同时混合时间与变量,把循环网络带回多元时序预测
人工智能·python·深度学习·数据挖掘·transformer
Gh0st_Lx26 分钟前
【1】MySQL MVCC 与隔离级别
数据库·mysql·mvcc
ss27330 分钟前
AI时代首先数据库-PostgreSQL实战笔记 | 15 PostgreSQL子查询与嵌套查询(上)
数据库·人工智能·postgresql
骑士雄师30 分钟前
多轮对话流程梳理详细版本
python
进击的明明14 小时前
当AI开始“边想边干”:深入聊聊ReAct,以及如何用Python手搓一个简单Agent
python·面试·agent
这个DBA有点耶15 小时前
从症状到根因:数据库监控指标的分层方法与静态/动态阈值策略
数据库·mysql·代码规范