Die Funktion array_diff_assoc () ist ein Element, das in PHP verwendet wird, um zwei oder mehr Arrays zu vergleichen, und gibt ein Array zurück, das Elemente enthält, die im ersten Array, aber nicht in anderen Arrays vorhanden sind. Im Gegensatz zur Funktion array_diff () vergleicht Array_diff_assoc () die Schlüsselnamen und Schlüsselwerte des Array gleichzeitig. Wenn sowohl der Schlüsselname als auch der Schlüsselwert übereinstimmen, wird er ausgeschlossen.
In der tatsächlichen Entwicklung kann jedoch, wenn die Schlüsselname -Arten von Arrays inkonsistent sind, und kann unter array_diff_assoc () ein unerwartetes Verhalten verursachen. In diesem Artikel wird erläutert, warum die inkonsistenten Arrayschlüsselnamen -Typen Probleme verursachen und einige Lösungen bereitstellen können, um dies zu vermeiden.
PHP ist eine schwach typisierte Sprache, was bedeutet, dass sie automatisch den Typ konvertiert. Beispielsweise sind die Schlüsselnamen 1 (Ganzzahl) und '1' (String) in einem Array im Vergleich gleich. Diese automatische Konvertierung kann zu inkonsistenten Arrayschlüsselnamen -Typen führen, was einen Fehler bei der Verwendung von Array_Diff_assoc () aufwirft.
Betrachten Sie den folgenden Code:
<?php
$array1 = array(1 => 'apple', '1' => 'orange');
$array2 = array(1 => 'banana', '1' => 'orange');
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>
In diesem Beispiel enthalten $ Array1 und $ Array2 beide Schlüsseldamen 1 und '1' . Da PHP '1' automatisch in Ganzzahl 1 konvertiert, gelten diese beiden Schlüsselnamen gleich. Daher ist Array_diff_assoc () der Ansicht, dass die Schlüsselwerte dieser beiden Arrays genau gleich sind und tatsächlich unterschiedlich sein sollten.
Vergleichsregeln für Schlüsselname : Array_Diff_assoc () vergleicht nicht nur die Werte des Arrays, sondern auch die Schlüsselnamen. PHP ist streng beim Vergleich von Schlüsselnamen, sodass verschiedene Schlüsselnamentypen die Vergleichsergebnisse des Arrays beeinflussen.
Automatische Konvertierung des Typs : Da PHP beim Vergleich automatischer Konvertierung durchführt, werden Unterschiede in den Schlüsselnamentypen (wie 1 und '1' ) ignoriert, was zu unerwartetem Verhalten führen kann. Beispielsweise ist im obigen Beispiel Array_Diff_assoc () ein leeres Array, da 1 und '1' als gleich angesehen werden.
Schwer zu Debugug -Fehler : Diese Art von Inkonsistenz erscheint möglicherweise nicht sofort, insbesondere in großen Anwendungen. Dies kann dazu führen, dass das Programm in einigen Fällen falsche Ergebnisse zurückgibt, die schwer zu erkennen und zu beheben sind.
EXKENNISIEREN SIE DEN Tschlüsselnamentypen : Bevor Sie Array_Diff_assoc () verwenden, stellen Sie sicher, dass die Schlüsselnamentypen des Arrays konsistent sind. Alle Schlüsselnamen können unter Verwendung der Funktionen intval () oder strval () in denselben Typ konvertiert werden.
Konvertieren Sie beispielsweise alle Schlüsselnamen in Zeichenfolgen:
<?php
$array1 = array('1' => 'apple', 1 => 'orange');
$array2 = array(1 => 'banana', '1' => 'orange');
// Konvertieren Sie alle Schlüsselnamen in Saiten
$array1 = array_map(function($key) { return strval($key); }, array_keys($array1));
$array2 = array_map(function($key) { return strval($key); }, array_keys($array2));
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>
Verwenden Sie Array_Diff () anstelle von Array_diff_assoc () : Wenn Sie sich nur um den Wert des Arrays und nicht um den Schlüsselnamen kümmern, sollten Sie array_diff () verwenden. Array_Diff () vergleichen nicht die Schlüsselnamen des Arrays, sondern vergleicht nur die Werte, die Probleme vermeiden können, die durch inkonsistente Schlüsselnamen verursacht werden.
Casting verwenden : In einigen Fällen wird das Casting verwendet, um die Konsistenz der Schlüsselnamen zu gewährleisten. Der Schlüsselname -Typ eines Arrays kann explizit mit (int) oder (String) konvertiert werden.
<?php
$array1 = array(1 => 'apple', '1' => 'orange');
$array2 = array(1 => 'banana', '1' => 'orange');
// Der Gussschlüsselname ist eine Ganzzahl
$array1 = array_map(function($key) { return (int) $key; }, array_keys($array1));
$array2 = array_map(function($key) { return (int) $key; }, array_keys($array2));
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>
Überprüfen Sie den Schlüsselnamentyp eines Arrays gründlich : Bevor Sie ein Array -Vergleich durchführen, können Sie var_dump () oder Gettyp () verwenden, um die Typen von Schlüsselnamen im Array zu überprüfen, um sicherzustellen, dass sie gleich sind.
<?php
var_dump(array_keys($array1));
var_dump(array_keys($array2));
?>
Durch diese Maßnahmen können Sie die Verwendung von array_diff_assoc () aufgrund inkonsistenter Schlüsselnamentypen effektiv vermeiden.