array_diff()返回仅存在于第一个数组中、其他数组均不含的元素,保留原键名,值比较采用松散等价(==),不支持多维深层比较,亦非双向差集。

理解 array_diff() 的返回结果,关键就一点:它只关心第一个数组里有哪些值,是其他所有数组里都完全找不到的,然后原封不动地把它们(连同原始键名)返回。
返回的是“仅属于第一个数组”的元素
不是双向对比,也不是找“彼此独有的”,更不是取交集或并集。它单向扫描 array1 中的每一个值,只要这个值在 array2、array3……中任何一个出现过(松散比较),就排除掉。
- 即使
array2里有array1没有的值,也不会出现在结果里 - 即使多个数组之间互有差异,
array_diff也不管——它只以array1为唯一基准 - 键名会被完整保留,但键名本身不参与比较
值比较用的是“松散等价”(==)
这意味着类型不同但可转换相等的值会被当作相同处理:
-
"1"(字符串)和1(整数) → 判定为相等,后者不会出现在结果中 -
true和1、false和0、空字符串和0等也同理 - 如果需要严格比较(===),得改用
array_udiff()配合自定义回调函数
多维数组只能比第一层
array_diff() 把整个子数组当做一个不可拆分的值来对待:
-
["a" => [1,2]]和["b" => [1,2]]→ 子数组[1,2]被整体比较,若完全一致则视为相同 - 但它不会深入到
[1,2]内部去比数字 1 或 2 是否单独存在 - 要逐层比对深层结构,必须手动递归调用或写自定义函数
常见误读澄清
很多人初看文档容易误解成“找出所有数组之间的不同”,实际逻辑更简单也更局限:
- ❌ 不是“去掉所有数组共有的值”(那是多个
array_diff链式调用才可能逼近的效果) - ❌ 不是“返回两个数组各自的独有部分”(那需要两次调用:
array_diff($a,$b)+array_diff($b,$a)) - ✅ 是“从 $a 里筛出那些在 $b、$c、$d……里一个都没露过面的值”
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











