PHP-Funktion array_diff_uassoc verstehen
Erfahren Sie, wie array_diff_uassoc() in PHP Arrays mit benutzerdefiniertem Schlüsselvergleich vergleicht und Unterschiede zurückgibt.
array_diff_uassoc() vergleicht zwei (oder mehr) Arrays mit einer zusätzlichen Schlüsselprüfung und ermöglicht es, eine eigene Funktion für den Schlüsselvergleich bereitzustellen. Sie gibt jeden Eintrag aus dem ersten array zurück, dessen Schlüssel/Wert-Paar in keinem der anderen Arrays übereinstimmt. Diese Seite erläutert die Signatur, erklärt genau, wie der Abgleich funktioniert, und zeigt, wann diese Funktion statt der einfacheren Array-Diff-Funktionen verwendet werden sollte.
Das „u" im Namen steht für benutzerdefiniert (user-supplied) beim Schlüsselvergleich; „assoc" bedeutet, dass auch die Schlüssel geprüft werden (ein assoziativer Vergleich).
Signatur
array_diff_uassoc(
array $array,
array ...$arrays,
callable $key_compare_func
): array$array— das array, aus dem verglichen wird. Seine Einträge erscheinen im Ergebnis.$arrays— ein oder mehrere Arrays, gegen die verglichen wird.$key_compare_func— ein Callbackfn(mixed $a, mixed $b): int, der0zurückgibt, wenn zwei Schlüssel als gleich gelten, und andernfalls eine negative/positive ganze Zahl (derselbe<=>Vertrag wie beiusort). Eingebaute Funktionen wiestrcasecmppassen zu dieser Signatur.
Die Funktion gibt ein neues array zurück; die ursprünglichen Arrays werden nicht verändert.
Wie der Vergleich funktioniert
Dieser Punkt führt häufig zu Verwirrung. array_diff_uassoc() behält einen Eintrag aus $array nur dann, wenn beide der folgenden Bedingungen für ihn in den anderen Arrays zutreffen:
- Der Wert stimmt nicht überein (Werte werden nach der Umwandlung in string mit dem regulären, losen
==verglichen — dieselbe Regel wie beiarray_diff()), oder - Der Schlüssel stimmt laut der
$key_compare_funcnicht überein.
Anders formuliert: Ein Eintrag wird entfernt, nur wenn ein anderes array denselben Wert unter einem Schlüssel enthält, den der Callback als gleich betrachtet. Der benutzerdefinierte Callback steuert also die Schlüssel; die Werte werden weiterhin nach PHPs interner Regel verglichen. Dieser letzte Punkt ist das häufigste Missverständnis — der Callback gilt nur für Schlüssel.
Beispiel
Preislisten mit Schlüsseln ohne Groß-/Kleinschreibung vergleichen
Ausgabe:
Array
(
[Banana] => 0.5
[Cherry] => 3
)Durchlauf durch jeden Eintrag von $prices:
Apple => 1.20—strcasecmp("Apple", "apple")ergibt0, die Schlüssel stimmen also überein, und der Wert1.20stimmt ebenfalls mit$updated["apple"]überein. Beide stimmen überein, daher wird er entfernt.Banana => 0.50— die Schlüssel stimmen überein (strcasecmp("Banana", "banana") === 0), aber die Werte unterscheiden sich (0.50vs.0.75). Da der Wert nicht übereinstimmt, wird der Eintrag behalten.Cherry => 3.00— kein Schlüssel in$updatedstimmt überein, daher wird er behalten.
Dies zeigt die Regel in der Praxis: Ein übereinstimmender Schlüssel allein reicht nicht aus, um einen Eintrag zu entfernen — auch der Wert muss übereinstimmen.
Verwandte Diff-Funktionen
array_diff_uassoc() gehört zur Familie der Array-Differenz-Funktionen. Wählen Sie die Funktion, deren Vergleichsstrategie zu Ihren Daten passt:
array_diff()— vergleicht nur Werte; Schlüssel werden ignoriert.array_diff_assoc()— vergleicht Schlüssel und Werte mit den eingebauten Regeln (keine Callbacks).array_diff_key()— vergleicht nur Schlüssel mit dem eingebauten Vergleich.array_diff_ukey()— vergleicht nur Schlüssel, aber mit einem Callback für die Schlüssel.array_udiff()— vergleicht Werte mit einem Callback; Schlüssel werden ignoriert.array_udiff_assoc()— Callback für Werte, eingebaute Prüfung für Schlüssel.array_udiff_uassoc()— Callbacks für sowohl Werte als auch Schlüssel.
Wann sollte man sie verwenden?
Greifen Sie auf array_diff_uassoc() zurück, wenn Schlüssel für den Vergleich wichtig sind, der Standard-Schlüsselabgleich jedoch zu streng ist — zum Beispiel wenn Schlüssel sich nur durch Groß-/Kleinschreibung oder Formatierung unterscheiden, oder wenn Schlüssel Objekte/Werte sind, die benutzerdefinierte Logik benötigen, um als „gleich" zu gelten. Wenn Sie nur Werte vergleichen möchten, verwenden Sie array_udiff(); wenn Sie auch für die Werte einen Callback benötigen, verwenden Sie array_udiff_uassoc().
Fazit
array_diff_uassoc() gibt die Einträge des ersten Arrays zurück, die in den anderen Arrays keine Schlüssel/Wert-Übereinstimmung haben, wobei ein von Ihnen bereitgestellter Callback entscheidet, wann zwei Schlüssel gleich sind. Beachten Sie, dass Werte weiterhin nach PHPs eingebauter Regel verglichen werden — ein Eintrag bleibt erhalten, sofern nicht sowohl sein Schlüssel als auch sein Wert anderswo übereinstimmen.