In der PHP-Programmierung wird die Funktion array_diff_assoc () verwendet, um Schlüsselwertpaare von zwei oder mehr Arrays zu vergleichen, wobei diese Schlüsselwertpaare, die sich im ersten Array befinden, jedoch nicht in anderen Arrays, zurückgeben. Es funktioniert, indem es die Summe der Arrays verglichen. Viele Entwickler stoßen jedoch auf einige Probleme, wenn sie array_diff_assoc () verwenden, insbesondere wenn es sich um Strings und numerische Typen handelt. In diesem Artikel wird diese gemeinsamen Missverständnisse und deren Gründe untersucht.
Bevor Sie das Problem im Detail diskutieren, überprüfen wir die grundlegende Verwendung der Funktion array_diff_assoc () :
<?php
$array1 = ['a' => 'apple', 'b' => 10, 'c' => 15];
$array2 = ['a' => 'apple', 'b' => '10', 'c' => 20];
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>
Das Ausgangsergebnis ist:
Array
(
[b] => 10
[c] => 15
)
Obwohl der Schlüsselwert "B" im Array $ Array2 die Zeichenfolge '10' ist und der Schlüsselwert 'B' in $ array1 die Ganzzahl 10 ist, berücksichtigt Array_Diff_assoc () sie unterschiedlich und gibt sie als Differenz zurück.
Dieses Problem tritt bei der impliziten Typumwandlung in PHP auf. Wenn Sie versuchen, verschiedene Datenarten zu vergleichen, wandelt PHP sie automatisch in denselben Typ um. Wenn Sie beispielsweise Array_Diff_assoc () Vergleich durchführen, behandelt PHP sie als unterschiedliche Typen, was zu Fehlern führt, wenn ein Schlüsselwertpaar im Array String-Typ und numerischen Typ enthält.
Zum Beispiel:
<?php
$array1 = [0 => '10'];
$array2 = [0 => 10];
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>
Dieser Code gibt aus:
Array
(
[0] => 10
)
Obwohl Array_diff_assoc () zum Vergleich von Schlüssel und Werten verwendet wird, und beide im Array die gleichen "10" sind, betrachtet die Funktion sie aufgrund inkonsistenter Typen als unterschiedlich (einer ist eine Zeichenfolge und der andere ist eine Ganzzahl).
Implizite Typumwandlung in PHP kann dazu führen, dass die Funktion array_diff_assoc () ungenaue Ergebnisse zurückgibt. Wenn Sie beispielsweise als Vergleich in eine Zeichenfolge und eine Zahl übergeben, wandelt PHP die Nummer je nach Kontext standardmäßig in eine Zeichenfolge oder eine Zeichenfolge um.
Beispielsweise wird der folgende Code auf einen Fehler stoßen:
<?php
$array1 = ['a' => '123'];
$array2 = ['a' => 123];
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>
Ausgabe:
Array
(
[a] => 123
)
array_diff_assoc () glaubt, dass '123' und 123 unterschiedlich sind, da eine Zeichenfolge und die andere eine Zahl ist, die dazu führt, dass das Ergebnis nicht die Erwartungen erfüllt.
Um Vergleichsfehler aufgrund von Inkonsistenz vom Typ Typ zu vermeiden, wird empfohlen, sicherzustellen, dass die Werttypen im Array bei Verwendung von Array_Diff_assoc () konsistent sind. Wenn Sie verschiedene Arten von Werten vergleichen müssen, können Sie die expliziten Konvertierung der Type durchführen.
Vor dem Vergleich können alle Werte explizit in denselben Typ konvertiert werden, beispielsweise in eine Zeichenfolge oder in eine Zahl:
<?php
$array1 = ['a' => (string) 123];
$array2 = ['a' => '123'];
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>
Dieser Code stellt sicher, dass beide den gleichen Typ sind (Zeichenfolge), wodurch unnötige Fehler vermieden werden.
Wenn Sie alle Werte in einem Array bearbeiten müssen, können Sie die Funktion array_map () verwenden:
<?php
$array1 = ['a' => 123, 'b' => 456];
$array2 = ['a' => '123', 'b' => '456'];
$array1 = array_map('strval', $array1); // Konvertieren Sie alle Werte in Zeichenfolgen
$array2 = array_map('strval', $array2);
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>
Dies stellt sicher, dass die Werte in beiden Arrays im Vergleich array_diff_assoc () konsistent bleiben.
Bei der Verwendung der Funktion array_diff_assoc () sind String- und Zahlentypen aufgrund der impliziten Typumwandlung in PHP häufig falsch. Wenn ein Entwickler Array -Vergleiche durchführt, ist es am besten sicher, dass alle im Vergleich beteiligten Werttypen konsistent sind. Explizite Typumwandlung oder die Verwendung von Helferfunktionen wie Array_Map () kann dazu beitragen, Probleme zu vermeiden, die durch Typ -Inkonsistenzen verursacht werden, wodurch Vergleiche genauer werden.