Start · Sprachen · PHP · Referenz · array_diff_uassoc

array_diff_uassoc

Funktion

Berechnet den Unterschied zwischen Arrays unter Berücksichtigung der Schlüssel, wobei der Schlüsselvergleich durch eine benutzerdefinierte Callback-Funktion erfolgt.

seit PHP 5.0.0 Kategorie: array

Signatur

array_diff_uassoc(array $array, array ...$arrays, callable $key_compare_func): array

Beschreibung

array_diff_uassoc() vergleicht das erste Array $array mit einem oder mehreren weiteren Arrays und gibt alle Einträge zurück, deren Kombination aus Schlüssel und Wert in keinem der anderen Arrays vorkommt. Der entscheidende Unterschied zu array_diff_assoc() liegt darin, dass der Schlüsselvergleich nicht intern, sondern durch eine vom Entwickler bereitgestellte Callback-Funktion durchgeführt wird.

Die Callback-Funktion muss denselben Vertrag erfüllen wie eine Vergleichsfunktion für usort(): Sie erhält zwei Schlüssel als Argumente und muss eine negative Zahl zurückgeben, wenn der erste kleiner als der zweite ist, 0 bei Gleichheit, und eine positive Zahl, wenn der erste größer ist.

Dies ist besonders nützlich, wenn Schlüssel auf eine nicht-standardmäßige Weise verglichen werden sollen, z. B. case-insensitiv, numerisch normalisiert oder anhand eigener Objekt-IDs.

Beachte, dass der Wertevergleich weiterhin intern (als Zeichenketten) erfolgt – nur der Schlüsselvergleich wird durch die Callback-Funktion gesteuert. Die Funktion gibt ein Array zurück, das alle Schlüssel-Wert-Paare aus dem ersten Array enthält, die in keinem der Vergleichs-Arrays vorhanden sind.

Parameter

Name Typ Default Beschreibung
$array Pflicht array Das Quell-Array, aus dem die Unterschiede ermittelt werden.
$arrays Pflicht array Ein oder mehrere Arrays, mit denen $array verglichen wird. Mindestens eines muss angegeben werden.
$key_compare_func Pflicht callable Eine benutzerdefinierte Vergleichsfunktion für die Schlüssel. Sie erhält zwei Schlüssel und muss einen int zurückgeben: negativ, wenn der erste Schlüssel kleiner ist, 0 bei Gleichheit, positiv wenn größer.

Rückgabewert

Typ
array
Beschreibung
Gibt ein Array zurück, das alle Schlüssel-Wert-Paare aus $array enthält, für die keine übereinstimmende Schlüssel-Wert-Kombination in einem der weiteren Arrays gefunden wurde. Die Schlüssel des Quell-Arrays bleiben erhalten.

Beispiele

Grundlegende Verwendung mit strcmp als Schlüsselvergleich

<?php
$array1 = ['a' => 'Apfel', 'b' => 'Banane', 'c' => 'Kirsche'];
$array2 = ['A' => 'Apfel', 'b' => 'Birne',  'c' => 'Kirsche'];

// Vergleich mit strcmp (case-sensitiv)
$result = array_diff_uassoc($array1, $array2, 'strcmp');

print_r($result);
// 'a' => 'Apfel'  ist drin, weil Schlüssel 'a' != 'A' (case-sensitiv)
// 'b' => 'Banane' ist drin, weil Wert 'Banane' != 'Birne'
// 'c' => 'Kirsche' ist NICHT drin, weil Schlüssel und Wert übereinstimmen
Array ( [a] => Apfel [b] => Banane )

Case-insensitiver Schlüsselvergleich mit strcasecmp

<?php
$array1 = ['Vorname' => 'Anna', 'Nachname' => 'Müller', 'Stadt' => 'Berlin'];
$array2 = ['vorname' => 'Anna', 'nachname' => 'Schmidt', 'STADT' => 'Berlin'];

// strcasecmp ignoriert Groß-/Kleinschreibung bei den Schlüsseln
$result = array_diff_uassoc($array1, $array2, 'strcasecmp');

print_r($result);
// 'Vorname'  => 'Anna'   fehlt, da Schlüssel (case-insensitiv) gleich UND Wert gleich
// 'Nachname' => 'Müller' bleibt, da Wert 'Müller' != 'Schmidt'
// 'Stadt'    => 'Berlin' fehlt, da Schlüssel (case-insensitiv) gleich UND Wert gleich
Array ( [Nachname] => Müller )

Eigene Callback-Funktion für numerisch normalisierte Schlüssel

<?php
$preise1 = ['01' => 9.99, '02' => 14.50, '03' => 5.00];
$preise2 = ['1'  => 9.99, '2'  => 14.50, '4'  => 8.00];

// Numerischer Vergleich: '01' == '1', '02' == '2' usw.
$compareNumeric = function(string $a, string $b): int {
    return (int)$a - (int)$b;
};

$result = array_diff_uassoc($preise1, $preise2, $compareNumeric);

print_r($result);
// '01' => 9.99  fehlt (nummerisch gleich zu '1', gleicher Wert)
// '02' => 14.50 fehlt (nummerisch gleich zu '2', gleicher Wert)
// '03' => 5.00  bleibt (Schlüssel '3' nicht in $preise2 vorhanden)
Array ( [03] => 5 )

// Wichtig · Fallstricke

Reihenfolge der Parameter: Die Callback-Funktion muss als letztes Argument übergeben werden, nach allen zu vergleichenden Arrays. Dies ist ein häufiger Fehler bei Funktionen dieser Familie (array_diff_uassoc, array_diff_ukey etc.).

Nur Schlüsselvergleich benutzerdefiniert: Der Wertevergleich erfolgt intern als Zeichenkettenvergleich. Wenn auch der Wertevergleich benutzerdefiniert sein soll, verwende array_udiff_uassoc().

Verwandte Funktionen im Überblick:

  • array_diff() — Wertevergleich, Schlüssel werden ignoriert
  • array_diff_assoc() — Wert- und Schlüsselvergleich, beide intern
  • array_diff_ukey() — nur Schlüsselvergleich benutzerdefiniert, Werte ignoriert
  • array_udiff_assoc() — Wertevergleich benutzerdefiniert, Schlüsselvergleich intern
  • array_udiff_uassoc() — beide Vergleiche benutzerdefiniert