php 7.4 中 serialize() 本身不直接支持二维数组去重,需配合 array_map() 和 array_unique():先序列化子数组为唯一字符串,再去重并反序列化还原;因 array_unique() 不支持多维数组且会将数组转为相同字符串“array”导致误判。

PHP 7.4 中 serialize() 本身**不直接支持去重**,但它可以配合其他函数(如 array_map()、array_unique())来实现二维数组去重——核心思路是:先将每个子数组序列化为唯一字符串,用 array_unique() 去重,再反序列化还原。
为什么不能直接对二维数组用 array_unique?
array_unique() 默认只支持一维数组,且对多维数组元素会报 Notice: Array to string conversion。因为 PHP 无法直接比较两个数组是否相等(底层按字符串对比时把 Array 转成字符串都变成 "Array",全一样)。
用 serialize + array_unique 实现二维数组去重(推荐方式)
这是 PHP 7.4 中稳定、易懂、无需额外扩展的方法:
- 对每个子数组调用
serialize(),得到唯一可比较的字符串 - 用
array_unique()去掉重复的序列化字符串 - 再用
unserialize()把结果还原为数组 - 注意:需确保子数组中不含资源(resource)、闭包(Closure)等不可序列化类型(PHP 7.4 中
serialize()对 Closure 会报致命错误)
示例代码:
$data = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 1, 'name' => 'Alice'], // 重复项
['id' => 3, 'name' => 'Charlie']
];
$serialized = array_map('serialize', $data);
$unique_serialized = array_unique($serialized);
$result = array_map('unserialize', $unique_serialized);
// $result 就是去重后的二维数组(顺序保留)
注意事项与优化建议
-
键名会重置:
array_map()返回索引数组,原键名丢失;如需保留原始键,可用foreach手动构建映射 -
性能考虑:数据量大时(如 > 1000 行),序列化/反序列化有开销;可改用
json_encode()替代(更快,但要求数据纯 UTF-8 且不含 NaN/Infinity 等) -
关联键顺序敏感:
['a'=>1,'b'=>2]和['b'=>2,'a'=>1]序列化结果不同,会被视为不同项;若需忽略键序,应先ksort()子数组 -
空数组或 null 值安全:
serialize(null)和serialize([])是合法的,不会出错
替代方案:用 json_encode(更轻量,适合简单数据)
如果二维数组只含标量、普通数组、对象(且无循环引用),可用 json_encode() 替代 serialize(),速度更快、可读性略好:
$jsons = array_map('json_encode', $data);
$unique_jsons = array_unique($jsons);
$result = array_map('json_decode', $unique_jsons);
// 注意:json_decode 默认返回对象,加第二个参数 true 得到关联数组
$result = array_map(fn($j) => json_decode($j, true), $unique_jsons);
不复杂但容易忽略细节,关键是选对序列化方式并处理好数据结构前提。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











