当以两种不同的方式比较数组时,为什么输出会有差异

时间:2013-01-23 03:28:06

标签: php arrays

我正在将数组与array_diff_keyarray_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
)

2 个答案:

答案 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;
                    });