首先从代码上看,我们通过比较运算符号来比较两个数组:var_dump([1,2]==[2,1]);//假var_dump([1,2,3]>[3,2,1]);//假var_dump([5,6,7]>[1,2,3,4]);//false第一组:仔细看,从正常的角度一目了然也就是说,代码中比较的数组其实是同一个数组,[1,2]和[2,1]是两个包含两个元素的数组,且元素内容相同,只是位置不同。第二组:相同位置不同,[1,2,3]小于[3,2,1]第三组:[5,6,7]各元素大于[1,2,3,4],但结果不如后一个数组大。相信很多同学已经看出了一些端倪。数组之间的运算符比较是先比较元素个数,再比较每个键值。官方文档中的解释是:成员越少的数组越小,如果操作数1中的key在操作数2中不存在,则无法比较数组,否则逐一比较值count($op2)){return1;//$op1>$op2}foreach($op1as$key=>$val){if(!array_key_exists($key,$op2)){returnnull;//不可比较}elseif($val<$op2[$key]){return-1;}elseif($val>$op2[$key]){返回1;}}返回0;//$op1==$op2}上面的代码是PHP中使用比较运算符比较数组时的代码,从count数组的元素个数开始。如果数组1大于数组2,则返回1,否则返回-1。如果相等,则遍历每个元素进行比较。如果数组1的某个键值在数组2中不存在,则返回null。如果数组1的某个键的值大于数组2的该键的值,则返回1,否则返回-1。当遍历的元素都相同时,最后返回0表示相等。使用普通的比较运算符来比较键值对形式的数组会更好,因为比较是用固定键进行的,而不是数组下标:var_dump(['a'=>1,'b'=>2]==['b'=>2,'a'=>1]);//turevar_dump(['a'=>1,'b'=>2]==['a'=>2,'b'=>1]);//falsevar_dump(['a'=>1,'b'=>5]<['a'=>2,'b'=>1]);//true注意第三次比较时,我们第一个数组的b元素大于第二个数组,但是从上面的数组比较代码可以看出,当第一个元素的比较结果大于或者小于情况下,直接return只要返回结果,后面的元素就不会再进行比较了。多维数组呢?var_dump([['aa'=>1],['bb'=>1,'dd'=>2]]==[['aa'=>2],['bb'=>1]]);//falsevar_dump([['aa'=>1],['bb'=>1,'dd'=>2]]<[['aa'=>2],['bb'=>1]]);//truevar_dump([['aa'=>1],['bb'=>1,'dd'=>2]]<[['aa'=>1,'cc'=>1],['bb'=>1]]);//真正的子数组会进行递归比较,比较规则还是按照默认的数组运算符比较方式。搞清楚了数组的比较是如何进行的,那么问题来了,假设前端传给我们的数据是这样的:['John','178cm','62kg',]里面存的是什么我们的数据库是:['62kg','John','178cm',]这个时候如果你直接比较两个数组的内容,或者直接用json字符串比较,不一样,你能怎样做?尝试自定义比较方法!函数array_equal($a,$b){return(is_array($a)&&is_array($b)&&array_diff($a,$b)===array_diff($b,$a));}$arr1=['John','178cm','62kg',];$arr2=['62kg','John','178cm',];var_dump(array_equal($arr1,$arr2));//true//元素如果不同$arr2=['62kg','JohnJobs','178cm',];var_dump(array_equal($arr1,$arr2));//false//把事情搞得更糟$arr1=[['55kg','Bob','172cm',['employee',],],['John','178cm','62kg',['经理',],],];$arr2=[['62kg','John','178cm',['经理',],],[['员工',],'55kg','172cm','鲍勃',],];var_dump(array_equal($arr1,$arr2));//true其实用到了函数array_diff(),它的作用是取两个数组的差值,然后比较两个数组差值的结果来判断两个数组是否相等这种方法适用于下标数组的比较,但不适用于键值对数组的比较。array_diff()只是值的差异结果集,不会比较键对,所以直接对键值对数组使用比较运算符即可!对于数组的比较,我们只需要搞清楚它的原理即可。如果原理不明确,可能会埋下隐藏的bug。比较数组的时候一定要记住这三点:1.先比较元素个数2.再比较每个元素(多维数组的递归比较)3.顺序,第一个有比较结果就不再继续比较后面Allareequal返回相等测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201910/source/PHP%E4%B8%AD%E6%AF%94%E8%BE%83%E6%95%B0%E7%BB%84%E7%9A%84%E6%97%B6%E5%80%99%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F.php参考链接:https://www.php.net/manual/zh/language.operators.comparison.php===========各媒体平台均可搜索【硬核项目经理】
