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

基于第二个值获取PHP多维数组差异(首元素需相等)

解决多维数组按指定条件对比差异的问题

我明白你的需求:要对比两个多维数组,只有当元素的第一个字符串值相等时,才去检查第二个整数值的差异,最终得到这些有差异的元素。用array_udiff来实现是完全可行的,关键是要写对回调函数的逻辑。

正确的回调函数逻辑

array_udiff的回调函数需要返回一个整数来判断元素是否为差异:

  • 返回0:表示两个元素“相同”,不会被纳入差异结果
  • 返回非0:表示两个元素“不同”,会被纳入差异结果

所以咱们的回调函数要分两步判断:

  • 第一步:先比较两个元素的第一个字符串值
    • 如果字符串不相等,直接返回0(让这两个元素被视为“相同”,排除在差异外)
    • 如果字符串相等,再比较第二个整数值,返回它们的差值(整数不同时返回非0,会被判定为差异)

代码示例

// 定义两个测试数组
$array1 = [
    ["apple", 5],
    ["banana", 3],
    ["orange", 7],
    ["grape", 2]
];

$array2 = [
    ["apple", 5],
    ["banana", 4],
    ["orange", 7],
    ["mango", 6]
];

// 自定义回调函数
function compareElements($a, $b) {
    // 先比较第一个字符串元素
    if ($a[0] !== $b[0]) {
        return 0; // 字符串不同,视为相同,不纳入差异
    }
    // 字符串相同,比较第二个整数元素
    return $a[1] - $b[1];
}

// 计算差异
$diff = array_udiff($array1, $array2, 'compareElements');

// 输出结果
print_r($diff);

运行结果解释

上面的代码运行后,输出会是:

Array
(
    [1] => Array
        (
            [0] => banana
            [1] => 3
        )

)

因为只有["banana", 3]和["banana", 4]的首字符串相同,但第二个整数不同,所以被纳入差异结果。其他元素要么首字符串不同(比如grape和mango),要么首字符串和整数都相同(apple、orange),都被排除在外。

补充说明

如果你需要同时得到两个数组中所有符合条件的差异(比如$array2中比$array1多的差异元素),可以分别对两个数组互相调用array_udiff,然后合并结果:

$diff1 = array_udiff($array1, $array2, 'compareElements');
$diff2 = array_udiff($array2, $array1, 'compareElements');
$fullDiff = array_merge($diff1, $diff2);
print_r($fullDiff);

这样就能得到两个数组中所有首字符串相同但整数不同的元素了。

内容的提问来源于stack exchange,提问作者Khaled

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:44:24