Signatur
Beschreibung
array_diff_ukey vergleicht die Schlüssel des ersten Arrays mit den Schlüsseln aller weiteren Arrays und gibt die Einträge des ersten Arrays zurück, deren Schlüssel in keinem der anderen Arrays vorkommen. Der eigentliche Vergleich der Schlüssel erfolgt über eine benutzerdefinierte Callbackfunktion, die das Verhalten von array_diff_key um flexible Vergleichslogik erweitert.
Der Callback erhält zwei Schlüssel als Argumente und muss eine Ganzzahl kleiner, gleich oder größer als 0 zurückgeben – je nachdem, ob der erste Schlüssel kleiner, gleich oder größer als der zweite ist. Dieses Muster ist identisch mit dem Kontrakt einer Sortierfunktion wie strcmp oder einem individuellen Komparator.
Die Funktion ist besonders nützlich, wenn Schlüssel nicht nach dem Standard-PHP-Gleichheitsoperator, sondern nach eigenen Regeln verglichen werden sollen – etwa bei case-insensitivem Vergleich, numerischer Normalisierung oder komplexen Objekt-IDs als Schlüssel.
Die Werte der Elemente spielen für den Vergleich keine Rolle; es werden ausschließlich die Schlüssel herangezogen. Das Ergebnis-Array behält die Original-Schlüssel und -Werte des ersten Arrays bei.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $array Pflicht | array | Das Ausgangs-Array, aus dem die Differenz berechnet wird. Nur Elemente dieses Arrays können im Ergebnis erscheinen. | |
| $arrays Pflicht | array | Ein oder mehrere Arrays, mit denen die Schlüssel des Ausgangs-Arrays verglichen werden. Mindestens ein Array ist erforderlich. | |
| $key_compare_func Pflicht | callable | Callbackfunktion mit der Signatur callback(mixed $key1, mixed $key2): int. Gibt einen negativen Wert zurück, wenn $key1 kleiner als $key2 ist, 0 bei Gleichheit und einen positiven Wert wenn $key1 größer als $key2 ist. |
Rückgabewert
Beispiele
Schlüsseldifferenz mit case-insensitivem Vergleich
<?php
$array1 = [
'Alpha' => 1,
'Beta' => 2,
'Gamma' => 3,
'Delta' => 4,
];
$array2 = [
'alpha' => 10,
'GAMMA' => 30,
];
// Vergleich der Schlüssel ohne Beachtung der Groß-/Kleinschreibung
$diff = array_diff_ukey($array1, $array2, 'strcasecmp');
print_r($diff);
Differenz mit numerisch normalisierten Schlüsseln
<?php
$products = [
'001' => 'Apfel',
'002' => 'Banane',
'010' => 'Kirsche',
'020' => 'Pflaume',
];
$exclude = [
'1' => 'irrelevant',
'10' => 'irrelevant',
];
// Vergleich als ganze Zahlen (führende Nullen ignorieren)
$diff = array_diff_ukey($products, $exclude, function ($a, $b) {
return (int)$a - (int)$b;
});
print_r($diff);
Differenz über mehrere Vergleichs-Arrays
<?php
$base = ['foo' => 1, 'bar' => 2, 'baz' => 3, 'qux' => 4];
$excl1 = ['FOO' => 'x'];
$excl2 = ['BAZ' => 'y'];
$result = array_diff_ukey($base, $excl1, $excl2, 'strcasecmp');
print_r($result);
// Wichtig · Fallstricke
Reihenfolge des Callbacks: Der Callback muss als letztes Argument übergeben werden, nach allen Vergleichs-Arrays. Ein falsches Platzieren führt zu einem TypeError bzw. einem unerwarteten Ergebnis.
Konsistenz des Callbacks: Der Komparator muss eine konsistente Ordnung liefern (transitiv, antisymmetrisch). Inkonsistente Callbacks können zu unvorhersehbaren Ergebnissen führen, da die interne Implementierung auf eine stabile Ordnung angewiesen ist.
Nur Schlüssel werden verglichen: Die Werte der Elemente haben keinen Einfluss auf das Ergebnis. Soll zusätzlich auch der Wert verglichen werden, ist array_diff_uassoc die richtige Wahl.
Alternativen: array_diff_key für Standard-Schlüsselvergleich, array_diff_uassoc für kombinierten Schlüssel-Wert-Vergleich mit Callback und array_intersect_ukey für die komplementäre Schnittmenge.