You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:47:44