W3docs

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 Callback fn(mixed $a, mixed $b): int, der 0 zurückgibt, wenn zwei Schlüssel als gleich gelten, und andernfalls eine negative/positive ganze Zahl (derselbe <=> Vertrag wie bei usort). Eingebaute Funktionen wie strcasecmp passen 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:

  1. Der Wert stimmt nicht überein (Werte werden nach der Umwandlung in string mit dem regulären, losen == verglichen — dieselbe Regel wie bei array_diff()), oder
  2. Der Schlüssel stimmt laut der $key_compare_func nicht ü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

php— editable, runs on the server

Ausgabe:

Array
(
    [Banana] => 0.5
    [Cherry] => 3
)

Durchlauf durch jeden Eintrag von $prices:

  • Apple => 1.20strcasecmp("Apple", "apple") ergibt 0, die Schlüssel stimmen also überein, und der Wert 1.20 stimmt 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.50 vs. 0.75). Da der Wert nicht übereinstimmt, wird der Eintrag behalten.
  • Cherry => 3.00 — kein Schlüssel in $updated stimmt ü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.

Übungen

Übung
Was trifft auf die PHP-Funktion array_diff_uassoc() basierend auf den Informationen in diesem Artikel zu?
Was trifft auf die PHP-Funktion array_diff_uassoc() basierend auf den Informationen in diesem Artikel zu?
Was this page helpful?