PHP数组比较运算符未达预期,如何判断无序数组值是否相同?
如何在PHP中比较两个数组是否包含相同值(不考虑顺序)
我太懂这个坑了!PHP的==运算符比较数组时,会同时检查元素值、顺序以及键名,所以哪怕元素完全一样只是顺序不同,结果也会是false,就像你碰到的情况一样。
几种靠谱的解决方案:
1. 先排序再比较(最直观高效)
把两个数组都排序后,再用===(或==)比较就行——排序后元素顺序一致,只要值相同就会匹配:
$roles = ['admin', 'manager']; $needle = ['manager', 'admin']; // 复制原数组避免修改原始数据 $sortedRoles = $roles; $sortedNeedle = $needle; sort($sortedRoles); sort($sortedNeedle); if ($sortedRoles === $sortedNeedle) { echo "两个数组值完全相同!"; }
如果是关联数组,就用asort()(保留键值对应关系的排序)或者ksort()(按键名排序),根据你的需求选择即可。
2. 利用array_diff判断双向差集
如果两个数组互相没有对方不存在的元素,说明它们的元素完全一致:
$roles = ['admin', 'manager']; $needle = ['manager', 'admin']; $hasExactRoles = empty(array_diff($roles, $needle)) && empty(array_diff($needle, $roles)); // $hasExactRoles 结果为 true
这个逻辑和你用array_intersect的思路本质一致,但写法更简洁——array_diff($a, $b)会返回$a里有但$b没有的元素,双向差集都为空的话,就证明两个数组元素完全相同。
关于你当前的array_intersect方案
你的写法是可行的,但可以稍微简化一下:
// 原写法 $hasExactRoles = (array_intersect($roles, $needle) === $roles) && (array_intersect($needle, $roles) === $needle); // 简化版(效果完全一致) $hasExactRoles = count(array_intersect($roles, $needle)) === count($roles) && count($roles) === count($needle);
不过相比排序或者array_diff的写法,这个可读性稍差一点,看你个人习惯选择就行。
注意:重复元素的情况
如果数组里有重复元素,比如$a = ['a', 'a', 'b'],$b = ['a', 'b', 'b'],上面的方法都能正确判断它们是不同的——排序后数组结构不一样,array_diff也会返回非空结果,不用担心误判。
内容的提问来源于stack exchange,提问作者Alexandre Demelas
相关产品推荐
相关产品推荐

