推荐「字段哈希 + 关联覆盖」法:提取关键字段拼接为唯一键(如 urlencode 或 md5),以键赋值实现自动覆盖,内存仅与唯一项数相关;慎用 serialize + array_unique(易内存溢出);百万级可用 splfixedarray + siphash 增量去重;业务需保留最优项时,键控结构中嵌入比较逻辑。

PHP 7.3 中处理超大二维数组去重,不能依赖简单序列化或全量遍历,否则极易内存溢出或超时。核心思路是:避开 array_unique 对多维数组的无效调用,绕过 serialize/unserialize 的内存峰值,用流式、键控、低开销方式控制去重粒度。
优先用「字段哈希 + 关联覆盖」法(推荐)
适用于明确知道去重依据字段(如 id、email、url 等)的场景。不序列化整个子数组,只拼接关键字段生成唯一键,用 PHP 原生数组键的自动覆盖特性实现 O(1) 插入判断。
- 提取目标字段值,用安全分隔符(如
|)拼接成字符串键,避免字段含分隔符可先urlencode或md5哈希 - 以该键为索引向临时数组赋值:
$unique[$key] = $item,重复键自动覆盖,天然保留最后出现项 - 最终用
array_values($unique)获取纯索引结果 - 内存占用仅与唯一项数量相关,不随原始数组总行数线性增长
慎用 serialize + array_unique(小数据可用,超大慎选)
虽然写法简洁,但在 PHP 7.3 中对百万级二维数组极易触发内存告警。每个 serialize() 会复制完整结构并生成冗长字符串,array_unique 内部仍需全量比对字符串。
- 仅建议用于子数组 ≤ 10 个元素、总行数 ≤ 5 万的数据
- 必须加
@抑制警告,并配合ini_set('memory_limit', '512M')(但非根本解法) - 不可用于含资源、闭包、对象引用的数组,会直接失败
用 SplFixedArray + 自定义哈希做增量去重(极致性能)
当数据量达百万行以上且字段类型统一(如全是整型 ID + 字符串 URL),可预分配固定大小的 SplFixedArray 模拟哈希表,配合 siphash 或 crc32 快速计算字段组合哈希值,实现接近 O(n) 的单次扫描去重。
- 需提前估算唯一键数量,设置足够容量避免哈希冲突退化
- 哈希函数要抗碰撞,避免用
md5($a.$b)这类易冲突拼接 - 适合 CLI 脚本长期运行场景,Web 请求中需注意超时限制
按业务逻辑保留“最优一条”而非简单去重
真实场景中,重复往往意味着多条记录(如不同时间采集的同一 URL 数据),需保留最新、最早或评分最高的一条。此时不应丢弃,而应设计带比较逻辑的键控结构:
- 键仍由去重字段生成,值存为完整子数组 + 辅助字段(如
updated_at) - 插入前对比新旧记录的业务字段(如时间戳),只在更优时更新
$unique[$key] - 避免额外排序,一次遍历完成筛选与去重
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











