PHP 7.3 中二维数组去重需分场景:全字段严格去重用 serialize+array_unique+unserialize;按指定键(如 id)去重用 array_column+array_flip;含不可序列化内容时用循环+in_array(true)。

PHP 7.3 中对关联二维数组去重,不能直接用 array_unique()(它只支持一维数组,官方文档明确说明不适用于多维数组),但有几种稳定、兼容 PHP 7.3 的实用方法。关键在于:是否要求**全字段严格一致去重**,还是**按指定键(如 id/email)去重**。下面分场景说明。
全数组内容严格去重(结构+值+键名完全相同)
这是最常见需求:两个子数组所有键名、键值、顺序都一样,就视为重复。推荐使用 serialize + array_unique + unserialize 组合,PHP 7.3 完全支持,且代码简洁:
- 遍历原数组,对每个子数组调用
serialize()转为字符串 - 用
array_unique()对字符串数组去重(此时是标准一维操作) - 再对结果逐个
unserialize()还原为二维数组 - 最后建议套一层
array_values()重置数字索引,避免键名稀疏
示例函数:
function uniqueAssoc2D($arr) {return array_values(array_map('unserialize', array_unique(array_map('serialize', $arr))));
}
?>
按某个或某几个字段去重(如保留唯一 'id' 或 'email')
当二维数组每项都有一个业务主键(比如 ['id' => 1, 'name' => '张三']),只需保证该字段不重复,其他字段可任意——这时更高效、更可控:
立即学习“PHP免费学习笔记(深入)”;
- 用
array_column($arr, 'id')提取所有 id 值 - 配合
array_keys(array_flip(...))获取去重后的 id 列表(自动去重并保留首次出现的键) - 再用
array_intersect_key($arr, array_flip($unique_ids))取出对应子数组
若需保留「每个 id 对应最新的一条」(比如按时间戳排序后取最后一条),可先 usort 排序再执行上述逻辑。
需要类型敏感或含不可序列化内容时的稳妥方案
如果子数组里可能包含资源、闭包(极少见)、或你特别在意类型比较(如 0 === '0' 不成立),serialize 就不合适。此时可用循环 + in_array($item, $result, true):
- 初始化空数组
$unique = [] -
foreach ($arr as $item)遍历,每次执行if (!in_array($item, $unique, true)) - 为真则
$unique[] = $item
该方式在 PHP 7.3 中行为稳定,true 参数确保键名、值、类型、顺序全部一致才判定为重复,但性能随数据量增长明显下降,适合几百条以内的数据。
避免踩坑的提醒
不要尝试 array_unique($arr, SORT_REGULAR) 期望它处理二维数组——PHP 7.3 仍不支持,会报错或返回意外结果;也不要依赖 json_encode 替代 serialize,因为浮点精度、NaN、Infinity 等会导致哈希不一致;另外,所有方法默认保留第一次出现的项,如需保留最后一次,需调整逻辑(例如翻转数组再处理,最后再翻转回来)。



















