这是我的测试代码:
$a = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"21");
$b = array("Peter"=>"35", "Ben"=>"21", "Joe"=>"43");
function leo_array_diff($a, $b) {
$map = array();
foreach($a as $val) $map[$val] = 1;
foreach($b as $val) unset($map[$val]);
return array_keys($map);
}
print_r(leo_array_diff($a, $b));
echo "<br>";
print_r(array_diff($a, $b));
这是它打印出来的内容:
Array ( [0] => 37 )
Array ( [Ben] => 37 )
我将引用 leo_array_diff()
函数:
第一个问题:
如您所见,Peter 是同一个号码,所以很好。 $a
ben 和 $b
ben 是不同的。 $a
和 $b
joe 是不同的。但这只是表明本不同。
也许是因为 $a
joe 21 与 $b
ben 是 21 相同?我怎样才能改变这一点? peter需要与peter对应,ben需要与ben对应,等等...
第二个问题:
Ben 是不同的,是的,因为 37 和 21 但在 print_r
中,它只显示 Array ( [0] => 37 )
。我怎样才能让它显示Array ([0] => 21)
?如何编辑函数而不在调用函数时交换参数?
最佳答案
首先你对array_diff有一个误解.
Returns an array containing all the entries from array1 that are not present in any of the other arrays.
它不会返回索引 Joe
,因为值 21
位于第一个数组中。
现在,为什么你的函数不起作用?好吧,让我们一步一步来。
这是第一次 foreach 后 map 的样子:
array(
'35' => '1',
'37' => '1',
'21' => '1'
)
然后,在第二个 foreach 中,您将循环遍历数组并删除值匹配的键。所以基本上,您要删除索引 35
和索引 21
,这就是为什么只保留索引 37。 这里真正的问题是因为您没有在任何地方检查名称。
这是您的函数的替代方案:
function leo_array_diff($a, $b) {
$map = array();
foreach($a as $name => $value){
// The name is not found in the second array
// Or the value is different from the first array
if(!isset($b[$name]) || $b[$name] != $value)
$map[$value] = 1;
}
return array_keys($map);
}
var_dump
将是:
array(2) {
[0]=>
int(37)
[1]=>
int(21)
}
关于php - 比较数组不打印差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42166487/