Signatur
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
$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);
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";
}
// 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.