In PHP ist Array_Diff () eine sehr häufige Funktion, die die Unterschiede zwischen Arrays ermitteln kann. Wenn wir es jedoch verwenden, um mit einem assoziativen Array in den tatsächlichen Projekten umzugehen, können wir, wenn wir nicht verstehen, wie es funktioniert, in viele "Gruben" geraten.
In diesem Artikel wird das Verhalten von Array_diff () , gemeinsamen Missverständnissen und einigen praktischen Techniken in der assoziativen Array-Verarbeitung eingehend erklärt.
$array1 = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry'];
$array2 = ['a' => 'apple', 'b' => 'blueberry'];
$result = array_diff($array1, $array2);
print_r($result);
Ausgabe:
Array
(
[b] => banana
[c] => cherry
)
Erläuterung: Array_Diff () vergleicht nur "Wert" und ignoriert den Schlüsselnamen . Obwohl die Schlüssel von $ array1 ['B'] = 'Banana' die gleichen wie $ array2 ['B'] = 'Blueberry' sind, wird 'Banane' aufgrund der unterschiedlichen Werte als einer der Unterschiede angesehen.
Missverständnis: Viele Entwickler glauben, dass Array_Diff () Schlüsselwertpaare vergleichen wird.
$a = ['id' => 1, 'name' => 'John'];
$b = ['name' => 'John', 'id' => 2];
var_dump(array_diff($a, $b));
Ausgabe:
array(1) {
["id"]=>
int(1)
}
Obwohl 'Name' => 'John' in beiden Arrays gleich ist, da Array_Diff () den Schlüssel nicht betrachtet, konzentriert er sich nur darauf, ob der Wert existiert. Also wird 'id' => 1 als unterschiedlich angesehen, da 1 nicht im Wert von $ b liegt.
? Lösung: Wenn Sie gleichzeitig Schlüssel und Werte vergleichen möchten, wird empfohlen, Array_diff_assoc () zu verwenden:
array_diff_assoc($a, $b);
Es wird gleichzeitig Schlüssel und Werte vergleichen und diese "Illusion" vermeiden.
$a = ['value1' => 123];
$b = ['value2' => '123'];
print_r(array_diff($a, $b));
Ausgabe:
Array
(
)
Pit -Punkt: Array_Diff () verwendet einen strikten Vergleich von richtig oder falsch ( == ), also werden 123 und '123' als gleich angesehen.
? Tipp: Wenn Sie einen strengen Vergleich benötigen (die Werte und Typen müssen konsistent sein), können Sie Array_Diff () 's Variante Array_Diff_Uassoc () mit einer benutzerdefinierten Vergleichsfunktion verwenden.
$result = array_udiff($a, $b, function($a, $b) {
return $a === $b ? 0 : ($a > $b ? 1 : -1);
});
Array_Diff () ist ein eindimensionales Array-Tool , das für mehrdimensionale Arrays nicht rekursiv verglichen wird.
$a = ['info' => ['id' => 1, 'name' => 'Tom']];
$b = ['info' => ['id' => 1, 'name' => 'Tom']];
print_r(array_diff($a, $b));
Ausgabe:
Array
(
[info] => Array
(
[id] => 1
[name] => Tom
)
)
Ursache: Der Wert des Array -Typs wird als Zeichenfolge in Array_Diff () behandelt und kann nicht direkt vergleichen, ob der Inhalt der beiden Arrays gleich ist.
? Lösung: Wenn Sie mehrdimensionale Arrays vergleichen möchten, müssen Sie rekursive Funktionen manuell schreiben oder mit der Serialisierungsumwandlung vergleichen:
$a_serialized = array_map('serialize', $a);
$b_serialized = array_map('serialize', $b);
$diff = array_diff($a_serialized, $b_serialized);
Angenommen, Sie ziehen ein Datenstück aus der Datenbank auf $ original , der Benutzer reicht ein Formular auf $ new_data ein und Sie möchten wissen, welche Felder geändert haben:
$original = ['name' => 'Alice', 'email' => 'a@m66.net'];
$new_data = ['name' => 'Alice', 'email' => 'alice@m66.net'];
$changed = array_diff_assoc($new_data, $original);
Auf diese Weise können Sie genau erhalten, welche Felder vom Benutzer geändert wurden.
Sie haben zwei Konfigurationsarrays $ config1 und $ config2 :
$config1 = include 'http://m66.net/config/old.php';
$config2 = include 'http://m66.net/config/new.php';
$diff = array_diff_assoc($config2, $config1);
Dies ermöglicht einen einfachen Zugriff auf Konfigurationsänderungen, insbesondere für das Schreiben in automatisierten Skripten.
Verfahren | Vergleiche Inhalte | Ob Sie zwischen Typen unterscheiden sollen | Geeignet für Szenen |
---|---|---|---|
Array_diff () | Vergleichen Sie nur Werte | NEIN | Einfacher Wertvergleich |
array_diff_assoc () | Vergleichen Sie den Wert + Schlüsselname | NEIN | Formular, Konfigurationsvergleich |
Array_udiff () | Benutzerdefinierte Vergleichsmethode | Anpassbar | Strikter Typvergleich |
Serialize + array_diff () | Mehrdimensionaler Array -Vergleich | Nein (skalierbar) | Mehrdimensionaler Strukturvergleich |
Wenn Sie Array_Diff () verwenden, sollten Sie sich darüber im Klaren sein, was Sie vergleichen. Lassen Sie sich nicht mit Schlüsselnamen irregeführt und vergessen Sie nicht die Auswirkungen des Typs. Nur durch das Verständnis dieser Prinzipien können Sie diese Werkzeugfunktion wirklich nutzen.
Wenn Sie in Ihrem Projekt auf spezielle Vergleichsanforderungen stoßen, schreiben Sie bitte eine Logik der Gadget -Funktionsfunktion von Hand - dies verbessert nicht nur die Lesbarkeit des Codes, sondern verringert auch die Wahrscheinlichkeit, in eine Grube einzubrechen.