array_udiff_uassoc() 不支持二维数组去重,因其值比较回调无法处理数组类型;推荐用 array_unique($arr, SORT_REGULAR) 全量去重,或按字段提取特征键结合 array_keys() 与 array_intersect_key() 实现精准去重。

PHP 7.4 中 array_udiff_uassoc() 本身不直接支持二维数组“去重”,它本质是比较**键名 + 键值**的差异,且要求传入的回调函数必须严格处理**标量值**(如字符串、数字)。对二维数组(即值为数组)直接使用会报错或行为异常,因为 PHP 无法用默认比较函数比较数组。
核心限制:不能直接比较数组值
该函数底层调用两个用户定义的比较函数:
-
第一个回调:比较**值(value)** —— 但 PHP 不允许直接用
<,==,>比较两个数组,所以若数组作为 value,此回调会出错或返回不可靠结果; - 第二个回调:比较**键名(key)** —— 这个通常没问题(键名一般是字符串/整型)。
因此,array_udiff_uassoc() 适用于「一维数组」或「值可序列化为唯一标量」的场景,不是为二维数组设计的“去重工具”。
实际可行方案:把二维结构转成可比形式
想用类似逻辑实现二维数组去重(比如按某几个字段判断是否重复),推荐以下方式:
立即学习“PHP免费学习笔记(深入)”;
-
用
array_unique()+ 自定义回调(PHP 7.4+ 支持):更简洁,专为去重设计。需先将每行转换为可比较的标量(如 JSON 字符串或拼接字符串),再去重,最后还原:
$arr = [
['id' => 1, 'name' => 'Alice', 'age' => 25],
['id' => 2, 'name' => 'Bob', 'age' => 30],
['id' => 1, 'name' => 'Alice', 'age' => 25], // 重复
];
<p>// 按完整结构去重(JSON 方式,注意顺序敏感)
$unique = array_unique($arr, SORT_REGULAR); // ✅ PHP 7.4+ 原生支持,最简单</p><p>// 或按指定字段去重(如只看 id 和 name):
$hashes = array_map(function($item) {
return $item['id'] . '|' . $item['name'];
}, $arr);
$uniqueKeys = array_keys(array_unique($hashes));
$unique = array_intersect_key($arr, array_flip($uniqueKeys));
如果坚持用 array\_udiff\_uassoc:模拟“全集减去重复”
可人为构造一个“无重复的基准数组”,再用 array_udiff_uassoc() 找出差异 —— 但这属于绕路,仅适合特殊对比需求(如找 A 数组中存在、B 数组中不存在的记录):
- 前提:两个数组都已规范化(例如 key 统一为 'id',value 是完整子数组);
- 把二维 value 转为可比标量(如
json_encode($val, JSON_UNESCAPED_UNICODE)); - 值比较回调中比较这些字符串,键比较回调照常写;
// 示例:找出 $arr1 中有、$arr2 中没有的项(按完整内容)
$arr1 = [['id'=>1,'n'=>'A'], ['id'=>2,'n'=>'B']];
$arr2 = [['id'=>1,'n'=>'A']];
<p>// 转换为带可比 value 的关联数组(以 id 为 key)
$map1 = array_column($arr1, null, 'id');
$map2 = array_column($arr2, null, 'id');</p><p>$result = array_udiff_uassoc(
$map1,
$map2,
function($a, $b) { return strcmp(json_encode($a), json_encode($b)); },
function($k1, $k2) { return $k1 <=> $k2; }
);
// $result 是 ['2' => ['id'=>2,'n'=>'B']]
总结建议
不要为二维数组去重硬套 array_udiff_uassoc()。PHP 7.4 下更自然的做法是:
- 全量结构去重 → 用
array_unique($arr, SORT_REGULAR); - 按特定字段去重 → 先提取特征键(如
array_column($arr, 'id')),再结合array_keys() + array_unique() + array_intersect_key(); - 需要“差集”语义(A 有 B 无)→ 先用
array_column(..., null, 'key')转为关联数组,再用array_diff_key()或自定义比较的array_udiff_uassoc()(配合json_encode做值比较)。
本质上,关键不在函数名,而在如何把“二维数据”映射成 PHP 能稳定比较的形态。



















