PHP 8.1 中推荐使用 array_unique($arr, SORT_REGULAR) 实现嵌套二维数组深层去重,它递归比较键名、值、类型及嵌套结构,自动保留首次出现项;含对象或资源时需改用 serialize 或自定义比较逻辑。

PHP 8.1 中对嵌套二维数组进行深层去重,关键在于“深层”——即需严格比对子数组的键名、键值、顺序、数据类型乃至嵌套结构(比如子数组里还含数组),而不能只靠 implode 或简单 == 判断。array_unique($arr, SORT_REGULAR) 在 PHP 8.1+ 已原生支持二维数组的深度全等比较,但有前提和细节需注意。
✅ 推荐首选:array_unique + SORT_REGULAR(PHP 7.2+ 原生支持,PHP 8.1 更稳定)
这是最简洁、安全、无需序列化的方案,适用于绝大多数含标量+普通嵌套数组的场景。-
SORT_REGULAR启用「结构化全等比较」,会递归比对键名、值、类型、嵌套层级。 - 要求子数组中不含资源(resource)、闭包(Closure)、对象(除非实现 __toString 或可序列化且一致)等不可比较项。
- 自动保留首次出现的项,索引不连续,可用
array_values()重置数字键。
示例代码:
```php $data = [ ['id' => 1, 'name' => 'Alice', 'tags' => ['admin', 'user']], ['id' => 2, 'name' => 'Bob', 'tags' => ['user']], ['id' => 1, 'name' => 'Alice', 'tags' => ['admin', 'user']], // 完全重复 ['id' => 3, 'name' => 'Charlie', 'tags' => ['guest']], ];$unique = array_values(array_unique($data, SORT_REGULAR)); print_r($unique);
<p>输出中第 0 和第 2 项被合并为一项,真正按内容深层去重。</p>
---
<H3>⚠️ 注意:当含对象、资源或需自定义逻辑时,不能直接用 array_unique</H3>
PHP 8.1 的 `array_unique` 对含对象的数组仍会触发 `===` 比较(即对象身份而非属性),导致误判。此时需手动处理:
- 若对象实现了 `JsonSerializable` 或可 `json_encode`,可用 JSON 字符串哈希去重;
- 若需按特定字段(如 `id` + `name`)判重,应提取唯一标识列;
- 若含深层嵌套(如三维数组作为子元素),`SORT_REGULAR` 仍有效,但性能略降。
<p>安全替代方案(兼容所有类型):</p>
<ul>
<li>用 <strong>array_map + serialize</strong>:适合无资源/闭包的纯数据数组(PHP 8.1 序列化更健壮)</li>
<li>用 <strong>循环 + custom deep_compare 函数</strong>:精确控制比较逻辑,例如跳过某些键、忽略浮点精度、标准化 null/'' 等</li>
</ul>
<p>简单 serialize 方案(一行写法):</p>
```php
$unique = array_map('unserialize', array_unique(array_map('serialize', $data)));⚠️ 注意:`serialize` 不支持资源、闭包、部分扩展对象;若数据干净,该写法在 PHP 8.1 下依然高效可靠。
? 针对「含唯一业务键」的高效去重(如 id/email)
如果二维数组每项都有天然唯一字段(如 `'user_id'` 或 `'email'`),不需逐层比对,推荐用键映射法,O(n) 时间:步骤简述:
立即学习“PHP免费学习笔记(深入)”;
- 用 array_column($data, 'email') 提取所有 email 值
- 用 array_keys(array_flip(...)) 去重并保留首次索引
- 用 array_intersect_key($data, ...) 取出对应行
代码示例:
```php $emails = array_column($data, 'email'); $uniqueKeys = array_keys(array_flip($emails)); // 自动去重并保留首现键 $unique = array_intersect_key($data, array_flip($uniqueKeys)); ```此法最快,但前提是存在稳定、可判重的单字段,不适用于“内容完全相同但 id 不同”的场景。
不复杂但容易忽略:PHP 8.1 的 array_unique($arr, SORT_REGULAR) 就是为这类深层二维数组设计的,只要数据结构规整,它就是最直接、最可靠的选择。



















