PHP如何判断两个数组是否存在增删改变化并返回布尔值
最优实现方案
场景1:需要严格匹配键、值、元素顺序、值类型
直接使用PHP原生的恒等不等运算符!==,一行搞定,性能比两次array_diff高得多:
// 数组发生变更返回true,未变更返回false $isChanged = $originalArray !== $newArray;
测试你提到的三类场景全部符合要求:
- 新增元素:
[1,2,3] !== [1,2,3,4]返回true - 删除元素:
[1,2,3] !== [1,2]返回true - 元素值变更:
[1,2,3] !== [1,3,5]返回true
如果不需要匹配元素顺序、只需要键值对匹配,就用宽松不等运算符!=:
$isChanged = $originalArray != $newArray;
比如['a'=>1, 'b'=>2] != ['b'=>2, 'a'=>1] 会返回false,认为两个数组相同。
场景2:只关心元素值的集合变化,不关心键和重复值
如果你的需求是忽略数组的键、顺序,只判断元素值的集合是否有变化,你现有的方案可以直接优化为符合返回值要求的写法:
$isChanged = !(count(array_diff($originalArray, $newArray)) === 0 && count(array_diff($newArray, $originalArray)) === 0);
注意这个方案有两个局限性:
- 无法正确识别重复值的变化:比如原数组
[1,1,2]和新数组[1,2,2]用这个方法会判断为未变更 - 只能对比标量类型的值,无法处理嵌套数组、对象等复杂元素
场景3:需要对比嵌套数组
如果数组里包含嵌套数组这类复杂结构,可以用序列化后对比的方案:
$isChanged = serialize($originalArray) !== serialize($newArray);
如果不需要匹配序列化的元数据,也可以用JSON编码对比:
$isChanged = json_encode($originalArray) !== json_encode($newArray);
内容的提问来源于stack exchange,提问作者SPQRInc
相关产品推荐
相关产品推荐

