PHP 7.2 中无法直接用 array_unique 对二维数组去重,需用 serialize() 或 json_encode() 将每行转为唯一字符串作键,再通过数组键自动去重,最后用 array_values() 重置索引。

PHP 7.2 中无法直接用 foreach 对二维数组“一键去重”,因为 array_unique() 默认只支持一维数组(对多维数组会报 Warning 并返回空或不正确结果)。但你可以借助 foreach 配合其他函数(如 serialize() / unserialize() 或 json_encode())实现逻辑去重。关键在于:把每行子数组“扁平化为唯一字符串标识”,再用键值映射去重。
用 serialize() + foreach 实现稳定去重
这是 PHP 7.2 最推荐的方式,兼容性好、能保留原始键名和结构,且对含非标类型(如 null、布尔、嵌套数组)也较可靠:
- 遍历二维数组,对每一行子数组调用
serialize($row)得到唯一字符串哈希 - 用该字符串作临时键,存入新数组(自动覆盖重复键)
- 最后用
array_values()重置数字索引(如需连续整数键)
示例代码:
$original = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 1, 'name' => 'Alice'], // 重复项
['id' => 3, 'name' => 'Charlie']
];
$unique = [];
foreach ($original as $row) {
$key = serialize($row);
$unique[$key] = $row; // 自动去重
}
$result = array_values($unique); // 可选:重置索引
用 json_encode() 替代(更简洁,但有局限)
如果数组只含 UTF-8 字符串、数字、null、布尔、普通数组(无资源、对象、闭包),可用 json_encode() 更轻量:
立即学习“PHP免费学习笔记(深入)”;
- 它生成的 JSON 字符串天然可比较,且比
serialize()更易读 - 注意:键顺序敏感(
['a'=>1,'b'=>2]≠['b'=>2,'a'=>1]),确保输入键序一致 - 中文等 Unicode 字符默认被转义,如需可加
JSON_UNESCAPED_UNICODE参数
$unique = [];
foreach ($original as $row) {
$key = json_encode($row, JSON_UNESCAPED_UNICODE);
$unique[$key] = $row;
}
$result = array_values($unique);
按指定字段去重(如仅根据 'id' 去重)
若你不需要整行完全相同才去重,而是希望“相同 id 的只留第一个”,则改用字段值作键:
- 遍历中检查
$seen_ids[$row['id']]是否已存在 - 未存在则保存并标记;已存在则跳过
- 这样可严格控制保留“首次出现”的元素
$seen_ids = [];
$result = [];
foreach ($original as $row) {
$id = $row['id'] ?? null;
if ($id !== null && !isset($seen_ids[$id])) {
$seen_ids[$id] = true;
$result[] = $row;
}
}
注意事项与避坑
PHP 7.2 下特别要注意:
-
不要直接对二维数组用
array_unique($arr, SORT_REGULAR)—— 它在 PHP 7.2 中仍不真正支持多维,可能静默失败或返回意外结果 -
serialize()生成的字符串含类名、长度等信息,安全性高,但体积略大;json_encode()更快但类型丢失(如0和"0"会被视为相同) - 若原数组含数字键(如
[0=>[...], 1=>[...]]),array_values()可恢复 0 开始的连续索引;若需保留原始键,去掉这步即可
不复杂但容易忽略细节,核心就是“把不可哈希的数组变成可哈希的字符串”,再靠 PHP 数组键唯一性完成去重。



















