这是我的测试代码:
$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()
功能:
第一个问题:
正如你所看到的,彼得是一个相同的数字,所以这很好。 $a
ben和$b
ben不同。 $a
和$b
乔是不同的。但它只显示本不同。
可能因为$a
乔21与$b
相同,本是21?我怎么能改变呢? peter需要与peter相对应,ben需要与ben等对应...
第二个问题:
Ben不同,是的,因为37和21但在print_r
中,它只显示Array ( [0] => 37 )
。我怎样才能让它显示Array ( [0] => 21 )
?如何在调用函数时编辑函数而不交换参数?
答案 0 :(得分:2)
首先,您对array_diff有误解。
返回一个数组,其中包含array1中任何其他数组中不存在的条目。
它没有返回索引Joe
,因为值21
位于第一个数组中。
现在,为什么你的功能不起作用?好吧,让我们一步一步走。
这是您的地图在第一次预告后的样子:
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)
}
答案 1 :(得分:0)
兑换$ a和$ b
的print_r(leo_array_diff($ B $ A));
只需交换数组......第一个参数用于显示差值因此使用该数组值的位置。