1

との配列を比較し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
)
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と文字列を比較すると、==両方とも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 に答える