我正在将数组与array_diff_key
和array_diff_ukey
进行比较,但输出与两个数组不同。手动说两个功能没有差异,除了后一个回复但是我得到了输出的差异。
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "");
print_r($result = array_diff_key($array1, $array2));
$result = array_diff_ukey($array1, $array2, function($key1, $key2) {
if ($key1 == $key2)
return 0;
elseif ($key1 > $key2)
return 1;
else
return -1;
});
print_r($result);
输出:
Array
(
[a] => green
[2] => red
)
Array
(
[2] => red
)
答案 0 :(得分:1)
这是因为您在回调中使用了==
运算符。比较字符串时,应始终使用===
。
var_dump("b" == 0);
> true
您可以通过修改回调输出相等的键来自行查看:
if ($key1 == $key2)
{
echo $key1 . " == " . $key2 . " = " . var_export($key1 == $key2, true) . "<br>";
return 0;
}
将导致:
0 == a = true
a == 0 = true
0 == b = true
b == 0 = true
a == 0 = true
0 == b = true
1 == 1 = true
原因是当你比较和int与一个字符串==
时,它们都将被转换为int值;所以“a”变为0。
答案 1 :(得分:0)
我明白了。
array_diff_*
函数版本比较值/键首先将它们以字符串类型转换然后进行比较。
所以我的回调应该是
$result = array_diff_ukey($array1, $array2, function($key1, $key2) {
if ((string) $key1 == (string) $key2)
return 0;
elseif ($key1 > $key2)
return 1;
else
return -1;
});