In PHP wird die Funktion array_diff_ukey verwendet, um die Schlüsselnamen zweier Arrays zu vergleichen und die Teile des ersten Arrays zurückzugeben, die sich von den Schlüsselnamen des zweiten Arrays unterscheiden. Bei der Verarbeitung von Array-Schlüsselnamen verwendet diese Funktion eine benutzerdefinierte Rückruffunktion, um die Schlüsselnamen zu vergleichen. Viele Entwickler ignorieren häufig ein sehr wichtiges Problem, wenn diese Funktion verwendet wird - Fallkonsistenz von Arrayschlüsselnamen.
Die Funktion array_diff_ukey akzeptiert drei Parameter:
array_diff_ukey(array $array1, array $array2, callable $key_compare_func): array
$ array1 : das erste Array
$ array2 : das zweite Array
$ key_compare_func : Eine Rückruffunktion, die zwei Arrayschlüsselnamen vergleicht. Die Rückruffunktion sollte zwei Schlüsselnamen als Parameter akzeptieren und eine Ganzzahl weniger als, die gleich oder größer als Null sind (ähnlich der STRCMP -Funktion).
Beispielsweise zeigt der folgende Code, wie die Funktion array_diff_ukey verwendet wird:
$array1 = [
"a" => "apple",
"b" => "banana",
"c" => "cherry"
];
$array2 = [
"A" => "apple",
"B" => "banana"
];
$result = array_diff_ukey($array1, $array2, "strnatcmp");
print_r($result);
In diesem Beispiel wird Array_Diff_Ukey die Schlüsselnamen von $ array1 und $ array2 vergleichen und die Schlüsselnamen und ihre Werte im ersten Array zurückgeben, die nicht im zweiten Array angezeigt werden. Bei der Verwendung der Vergleichsfunktion der StrnatCMP wird der Fall des Schlüsselnamens berücksichtigt.
Obwohl die Funktion array_diff_ukey durch benutzerdefinierte Vergleichsfunktionen den Schlüssennamenvergleich verarbeiten kann, kann dies zu einigen unerwarteten Ergebnissen führen, wenn die Vergleichsfunktion keine Fallprobleme gut behandelt.
Betrachten Sie beispielsweise den folgenden Code:
$array1 = [
"foo" => "bar",
"Bar" => "baz"
];
$array2 = [
"FOO" => "bar"
];
$result = array_diff_ukey($array1, $array2, "strnatcmp");
print_r($result);
Im obigen Beispiel wird Array_Diff_Ukey "Foo" und "Foo" als unterschiedliche Schlüsselnamen betrachten, da Strnatcmp Fall sensibel ist. Die Ausgabe wird also sein:
Array
(
[foo] => bar
[Bar] => baz
)
Dies zeigt, wie sich die Funktion array_diff_ukey standardmäßig verhält: Sie ignoriert die Konsistenz des Schlüsseldamens. Wenn der Entwickler Fall-unempfindliche Vergleiche erwartet, müssen Fallkonvertierungen in einer benutzerdefinierten Vergleichsfunktion umgehen.
Um das Problem der Fallkonsistenz zu lösen, können Entwickler eine unempfindliche Vergleichsfunktion schreiben. Beispielsweise können Sie Strtolower oder Strtoupper verwenden, um einheitlich in Kleinbuchstaben oder Großbuchstaben zu verwenden und zu vergleichen:
$array1 = [
"foo" => "bar",
"Bar" => "baz"
];
$array2 = [
"FOO" => "bar"
];
$result = array_diff_ukey($array1, $array2, function($key1, $key2) {
return strcmp(strtolower($key1), strtolower($key2));
});
print_r($result);
Auf diese Weise ist array_diff_ukey nicht mehr sensitiv und der Ausgang wird sein:
Array
(
[Bar] => baz
)
Bei Verwendung der Funktion array_diff_ukey müssen Entwickler auf den Fall von Schlüsselnamen achten. Wenn die Fallkonsistenz nicht ordnungsgemäß behandelt wird, können einige unerwartete Fehler und inkonsistentes Verhalten verursacht werden. Stellen Sie daher beim Schreiben benutzerdefinierter Vergleichsfunktionen sicher, dass die Fallunterschiede in Betracht gezogen werden, insbesondere wenn Sie sich mit Schlüsseldamen befassen. Wenn Sie einen von Fall unempfindlichen Vergleich durchführen möchten, können Sie Strtolower oder Strtoupper in der Vergleichsfunktion verwenden, um den Fall des Schlüsselnamens zu vereinen.
Dies kann Probleme vermeiden, die durch inkonsistenten Fall während der Entwicklung verursacht werden.