基于第二个值获取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
相关产品推荐
相关产品推荐

