在 PHP 8.2 中,去重二维数组应使用 array_unique($arr, SORT_REGULAR),并配合 array_values() 重置键;若需按单字段去重,则需手动遍历+哈希判断。

在 PHP 8.2 中,去除二维数组中完全相同的行(即去重),最直接有效的方式是使用 array_unique() 配合 SORT_REGULAR 标志,并确保数组键为数字索引(否则需先重排键)。PHP 8.2 默认支持该用法,无需额外扩展。
使用 array_unique() + SORT_REGULAR(推荐)
这是最简洁、原生且高效的方法。注意:必须传入 SORT_REGULAR,否则 array_unique() 在处理多维数组时会静默失败或返回意外结果(PHP 官方文档明确说明:对多维数组,仅当指定 SORT_REGULAR 时才按值比较)。
- 确保输入数组是「真正」的二维数值索引数组(如
[[1,'a'], [2,'b'], [1,'a']]) - 调用
array_unique($arr, SORT_REGULAR) - 结果默认保留原始键名,如需重置为连续数字键,可再套一层
array_values()
示例:
$data = [
['name' => 'Alice', 'age' => 30],
['name' => 'Bob', 'age' => 25],
['name' => 'Alice', 'age' => 30], // 重复
['name' => 'Charlie','age' => 35]
];
$unique = array_values(array_unique($data, SORT_REGULAR));
// 输出 3 行,重复的 Alice 被去掉了
若需按特定字段去重(非全行相等)
比如只根据 'name' 字段判断是否重复(忽略 age 差异),则 array_unique() 不适用,需手动处理:
立即学习“PHP免费学习笔记(深入)”;
- 遍历数组,提取目标字段值作为临时键(如
$seen[$row['name']] = true) - 用
array_filter()或循环 + 条件跳过已见项 - 注意处理字段可能不存在的情况(建议用 null 合并操作符:
$row['name'] ?? '')
避免常见错误
以下写法在 PHP 8.2 中无效或不可靠:
-
array_unique($arr)(不带标志)→ 只对一维有效,二维会返回空或原样 -
array_unique($arr, SORT_STRING)→ 强制转字符串比较,可能误判(如[1, '2']和['1', 2]转成字符串后相同) - 依赖
json_encode()后去重 → 效率低、顺序敏感(key 顺序不同会导致 JSON 不同)、浮点精度问题
补充:兼容关联键结构的稳妥写法
如果原始数组键名重要(如 ['user_123' => [...], 'user_456' => [...]]),又想保留首次出现的键名,可改用循环+哈希表方式:
$seen = [];
$result = [];
foreach ($data as $key => $row) {
$hash = md5(serialize($row)); // 或用 spl_object_hash 若已转对象
if (!isset($seen[$hash])) {
$seen[$hash] = true;
$result[$key] = $row;
}
}
但除非有特殊需求,优先用 array_unique(..., SORT_REGULAR) ——它更语义清晰、性能更好、且 PHP 8.2 已充分优化。



















