1

我将数组与array_diff_keyand进行比较,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
)
4

2 回答 2

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 与 string 进行比较时,==它们都会被转换为 int 值;所以“a”变成了0。

于 2013-01-23T03:37:36.343 回答
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;
                    });
于 2013-01-23T03:43:25.560 回答