array_diff_key($arr1, $arr2)可直接获取$arr1中独有的键;多个数组时需先合并其他数组的键并翻转,再传入array_diff_key。

用 array_diff_key() 配合 array_merge() 或直接用 array_diff_key($arr1, $arr2) 即可,关键是理解“只保留第一个数组独有的键”——即键存在于第一个数组、但不存在于其他数组中。
方法一:用 array_diff_key 直接对比
这是最简洁的方式,适用于两个数组:
$arr1 = ['a' => 1, 'b' => 2, 'c' => 3]; $arr2 = ['b' => 20, 'd' => 4]; $result = array_diff_key($arr1, $arr2); // 结果:['a' => 1, 'c' => 3]
-
array_diff_key比较的是键(key),不是值 - 它返回第一个数组中那些在后续数组里**完全找不到相同键名**的元素
- 不改变原数组,也不重排键顺序
方法二:多个数组时,把其余数组合并再比对
如果有三个或更多数组(如只留 $arr1 中独有键,排除 $arr2 和 $arr3):
$arr1 = ['a'=>1, 'b'=>2, 'c'=>3, 'e'=>5]; $arr2 = ['b'=>20, 'd'=>4]; $arr3 = ['c'=>30, 'f'=>6]; // 合并 $arr2 和 $arr3 的键,用于排除 $excluded_keys = array_merge(array_keys($arr2), array_keys($arr3)); $excluded = array_flip($excluded_keys); // 转成 key=>value 形式供 diff_key 使用 $result = array_diff_key($arr1, $excluded); // 结果:['a'=>1, 'e'=>5]
- 不能直接传多个数组给
array_diff_key做“多对一”排除(PHP 会报错) - 需先用
array_merge(array_keys(...))收集所有要排除的键,再用array_flip构造一个临时数组 - 这样
array_diff_key($arr1, $excluded)才能正确工作
注意:不要用 array_merge + array_diff_key 的组合来“覆盖”
常见误区是先 array_merge($arr1, $arr2) 再去重——这会保留后者键值,违背“只留第一个数组独有键”的要求。
立即学习“PHP免费学习笔记(深入)”;
-
array_merge是覆盖式合并,$arr2的键会覆盖$arr1的同名键,结果反而丢失了“独有性” - 如果目标是“取交集”或“取并集”,那是另一类需求,和本题逻辑相反
- 确认需求本质:是“差集(key 维度)”,不是“合并后去重”
扩展:封装成函数更清晰
为复用方便,可写一个通用函数:
function keepFirstUniqueKeys($arr1, ...$others) {
if (empty($others)) return $arr1;
$excluded = [];
foreach ($others as $arr) {
if (is_array($arr)) {
$excluded += array_flip(array_keys($arr));
}
}
return array_diff_key($arr1, $excluded);
}
// 使用
$result = keepFirstUniqueKeys($arr1, $arr2, $arr3);
- 支持任意多个待排除数组(PHP 5.6+ 的展开操作符
...) - 自动跳过非数组参数,避免警告
- 语义明确:只关心第一个数组的键是否“独家”



















