Start · Sprachen · PHP · Referenz · array_udiff_uassoc

array_udiff_uassoc

Funktion

Ermittelt die Differenz zweier oder mehrerer Arrays anhand benutzerdefinierter Callback-Funktionen für Wert- <em>und</em> Schlüsselvergleich.

seit PHP 5.0.0 Kategorie: array

Signatur

array_udiff_uassoc(array $array, array ...$arrays, callable $value_compare_func, callable $key_compare_func): array

Beschreibung

array_udiff_uassoc() berechnet die Differenz des ersten Arrays gegenüber allen weiteren Arrays. Anders als array_diff() werden dabei sowohl die Werte als auch die Schlüssel über je eine eigene Callback-Funktion verglichen. Im Ergebnis sind nur jene Schlüssel-Wert-Paare aus $array enthalten, die in keinem der Vergleichs-Arrays ein identisches Paar (gemäß beider Callbacks) besitzen.

Die Callback-Funktion für den Wertvergleich ($value_compare_func) sowie die Callback-Funktion für den Schlüsselvergleich ($key_compare_func) müssen jeweils dieselbe Signatur wie strcmp() aufweisen: sie erhalten zwei Argumente und müssen eine negative Zahl zurückgeben, wenn das erste Argument kleiner ist, 0 bei Gleichheit und eine positive Zahl, wenn das erste Argument größer ist.

Diese Funktion ist besonders dann nützlich, wenn weder Schlüssel noch Werte einfach mit dem ==-Operator verglichen werden können – etwa bei Objekten, bei sprachabhängigen Sortierungen (Collation) oder bei komplexen Vergleichslogiken, die beide Dimensionen eines assoziativen Arrays berücksichtigen müssen.

Die Reihenfolge der Argumente ist zu beachten: Nach dem ersten Array folgen beliebig viele Vergleichs-Arrays, gefolgt von den zwei Callbacks – zuerst für Werte, dann für Schlüssel.

Parameter

Name Typ Default Beschreibung
$array Pflicht array Das Ausgangs-Array, dessen Elemente auf Unterschiede geprüft werden.
$arrays Pflicht array Ein oder mehrere Arrays, mit denen $array verglichen wird. Es muss mindestens ein Vergleichs-Array übergeben werden.
$value_compare_func Pflicht callable Callback zum Vergleich der Werte. Erwartet zwei Parameter und gibt einen Integer < 0, = 0 oder > 0 zurück (analog zu strcmp()).
$key_compare_func Pflicht callable Callback zum Vergleich der Schlüssel. Erwartet zwei Parameter und gibt einen Integer < 0, = 0 oder > 0 zurück (analog zu strcmp()).

Rückgabewert

Typ
array
Beschreibung
Gibt ein Array zurück, das alle Schlüssel-Wert-Paare aus $array enthält, die in keinem der übergebenen Vergleichs-Arrays ein übereinstimmendes Paar haben (gemäß beiden Callbacks). Die Schlüssel bleiben erhalten.

Beispiele

Einfacher Vergleich mit benutzerdefinierten Callbacks

<?php
$array1 = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];
$array2 = ['a' => 1, 'b' => 5, 'e' => 3];

$result = array_udiff_uassoc(
    $array1,
    $array2,
    fn($v1, $v2) => $v1 <=> $v2,  // Wertvergleich
    fn($k1, $k2) => $k1 <=> $k2   // Schlüsselvergleich
);

print_r($result);
Array ( [b] => 2 [c] => 3 [d] => 4 )

Vergleich von Objekten nach Eigenschaft und Schlüssel (case-insensitive)

<?php
class Produkt {
    public function __construct(
        public string $name,
        public float $preis
    ) {}
}

$lager = [
    'apfel'   => new Produkt('Apfel', 1.20),
    'banane'  => new Produkt('Banane', 0.80),
    'kirsche' => new Produkt('Kirsche', 3.50),
];

$angebot = [
    'APFEL'  => new Produkt('Apfel', 1.20),
    'banane' => new Produkt('Banane', 0.90), // anderer Preis
];

// Nur Einträge, die weder Schlüssel- noch Wert-Übereinstimmung haben
$unterschied = array_udiff_uassoc(
    $lager,
    $angebot,
    fn($a, $b) => $a->preis <=> $b->preis,   // Werte: Preis vergleichen
    fn($k1, $k2) => strcasecmp($k1, $k2)     // Schlüssel: case-insensitiv
);

foreach ($unterschied as $key => $produkt) {
    echo "$key: {$produkt->name} ({$produkt->preis} €)\n";
}
banane: Banane (0.8 €) kirsche: Kirsche (3.5 €)

// Wichtig · Fallstricke

Argumentreihenfolge: Die beiden Callback-Funktionen müssen zwingend als letzte Argumente übergeben werden – nach allen Vergleichs-Arrays. Ein häufiger Fehler ist die Verwechslung der Callback-Reihenfolge: zuerst kommt $value_compare_func, dann $key_compare_func.

Rückgabewert der Callbacks: Die Callbacks müssen einen int zurückgeben (negativ, null oder positiv). Wird ein nicht-numerischer Wert zurückgegeben, kann das Verhalten undefiniert sein. Der Spaceship-Operator (<=>) eignet sich ideal für kompakte Callback-Implementierungen.

Verwandte Funktionen: Für einen reinen Wertvergleich ohne Schlüsselprüfung steht array_udiff() zur Verfügung. Soll nur der Schlüssel per Callback verglichen werden, bietet sich array_diff_ukey() an. Die Variante array_udiff_assoc() vergleicht Schlüssel intern (ohne Callback) und Werte per Callback.