PHP中如何找出标识键不同的两个二维数组的差异行?
解决PHP数组对比逻辑错误的问题
嘿,我一眼就发现问题所在了——你的代码逻辑完全搞反了!
你想要的是找出$arr2中uxid不存在于$arr1的uid中的元素,但当前代码却在遍历$arr1,找那些没出现在$arr2里的uid,这自然会返回空数组(因为$arr1里的所有uid都在$arr2里存在)。
先给你修正逻辑的基础版本代码
这个版本沿用你原来的嵌套循环思路,只是把遍历对象和判断方向反过来:
$arr1 = array( array("uid" => "cgajate"), array("uid" => "frankfurt9"), array("uid" => "ricoetc") ); $arr2 = array( array("uxid" => "cgajate"), array("uxid" => "ricoetc"), array("uxid" => "ricoetc1"), array("uxid" => "frankfurt9"), array("uxid" => "panterafan") ); $tmpArray = array(); foreach($arr2 as $data2) { $isExist = false; foreach($arr1 as $data1) { if($data2['uxid'] === $data1['uid']) { $isExist = true; break; // 找到匹配就跳出内层循环,不用继续遍历了 } } if($isExist === false) { $tmpArray[] = $data2; } } echo "<pre>"; print_r($tmpArray); echo "</pre>";
运行这个代码就能得到你想要的结果:包含ricoetc1和panterafan的数组。我还加了个break,找到匹配就停止内层循环,能小幅提升效率。
更高效的优化版本(推荐)
如果数组元素比较多,嵌套循环的效率会很低(时间复杂度O(n²))。我们可以先把$arr1的uid提取成一个一维数组,这样判断存在性只需要O(1)的时间:
$arr1 = array( array("uid" => "cgajate"), array("uid" => "frankfurt9"), array("uid" => "ricoetc") ); $arr2 = array( array("uxid" => "cgajate"), array("uxid" => "ricoetc"), array("uxid" => "ricoetc1"), array("uxid" => "frankfurt9"), array("uxid" => "panterafan") ); // 提取$arr1的uid到一维数组,用array_column更简洁 $arr1Uids = array_column($arr1, 'uid'); $tmpArray = array(); foreach($arr2 as $data2) { // 直接用in_array判断,效率更高 if(!in_array($data2['uxid'], $arr1Uids)) { $tmpArray[] = $data2; } } echo "<pre>"; print_r($tmpArray); echo "</pre>";
这里用array_column快速提取$arr1的所有uid,然后遍历$arr2时直接检查uxid是否在这个一维数组里,代码更简洁,效率也提升很多。
内容的提问来源于stack exchange,提问作者B Developer2
相关产品推荐
相关产品推荐

