Start · Sprachen · PHP · Referenz · array_intersect_ukey

array_intersect_ukey

Funktion

Ermittelt die Schnittmenge von Arrays anhand eines benutzerdefinierten Schlüsselvergleichs und gibt alle Einträge zurück, deren Schlüssel in allen übergebenen Arrays vorkommen.

seit PHP 5.1.0 Kategorie: array

Signatur

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

Beschreibung

array_intersect_ukey() vergleicht die Schlüssel des ersten Arrays mit den Schlüsseln aller weiteren Arrays mithilfe einer benutzerdefinierten Vergleichsfunktion. Zurückgegeben werden alle Schlüssel-Wert-Paare aus dem ersten Array, deren Schlüssel (laut der Callback-Funktion) in jedem der übrigen Arrays ebenfalls vorhanden sind. Die Werte spielen dabei keine Rolle.

Die Callback-Funktion muss das gleiche Verhalten wie ein Standard-Komparator haben: Sie erhält zwei Schlüssel als Argumente und soll eine negative Zahl zurückgeben, wenn das erste Argument kleiner als das zweite ist, 0 bei Gleichheit und eine positive Zahl, wenn das erste Argument größer ist. Dies entspricht der Signatur callback(mixed $a, mixed $b): int.

Die Funktion ist besonders nützlich, wenn Schlüssel nicht nach Standardregeln (z. B. case-insensitive oder normalisiert) verglichen werden sollen, sondern eine eigene Logik erforderlich ist. Im Gegensatz zu array_intersect_key() lässt sich so das Vergleichsverhalten vollständig anpassen.

Der letzte Parameter muss immer die Callback-Funktion sein; davor können beliebig viele Arrays übergeben werden. Es muss mindestens ein weiteres Array (zusätzlich zum ersten) und die Callback-Funktion angegeben werden.

Parameter

Name Typ Default Beschreibung
$array Pflicht array Das Ausgangs-Array, dessen Schlüssel-Wert-Paare gefiltert werden.
$arrays Pflicht array Ein oder mehrere weitere Arrays, gegen die die Schlüssel des ersten Arrays geprüft werden.
$key_compare_func Pflicht callable Vergleichsfunktion mit der Signatur callback(mixed $a, mixed $b): int. Gibt einen negativen Wert zurück, wenn $a < $b, 0 bei Gleichheit und einen positiven Wert, wenn $a > $b.

Rückgabewert

Typ
array
Beschreibung
Gibt ein Array zurück, das alle Schlüssel-Wert-Paare aus dem ersten Array enthält, deren Schlüssel (gemäß der Callback-Funktion) in allen anderen übergebenen Arrays vorhanden sind. Gibt ein leeres Array zurück, wenn keine Übereinstimmung gefunden wurde.

Beispiele

Einfacher Schlüsselvergleich mit Standardkomparator

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

$result = array_intersect_ukey($array1, $array2, function (string $a, string $b): int {
    return strcmp($a, $b);
});

print_r($result);
Array ( [a] => 1 [c] => 3 )

Groß-/Kleinschreibung ignorieren beim Schlüsselvergleich

<?php
$produkteLager = ['Apfel' => 50, 'Birne' => 30, 'Kirsche' => 20];
$bestellungen  = ['apfel' => 5,  'KIRSCHE' => 3, 'Mango' => 7];

// Schlüssel case-insensitiv vergleichen
$result = array_intersect_ukey(
    $produkteLager,
    $bestellungen,
    fn(string $a, string $b) => strcasecmp($a, $b)
);

print_r($result);
Array ( [Apfel] => 50 [Kirsche] => 20 )

Schnittmenge über drei Arrays

<?php
$a = ['x' => 1, 'y' => 2, 'z' => 3];
$b = ['x' => 9, 'y' => 8];
$c = ['y' => 7, 'z' => 6];

// Nur Schlüssel, die in allen drei Arrays vorkommen
$result = array_intersect_ukey($a, $b, $c, 'strcmp');

print_r($result);
Array ( [y] => 2 )

// Wichtig · Fallstricke

Reihenfolge der Parameter: Die Callback-Funktion muss zwingend als letztes Argument übergeben werden. Wird sie an einer anderen Position übergeben, führt dies zu einem Fehler oder unerwarteten Ergebnissen.

Nur Schlüssel werden verglichen: Die Werte der Arrays haben keinen Einfluss auf das Ergebnis. Sollen sowohl Schlüssel als auch Werte verglichen werden, sollte array_intersect_uassoc() verwendet werden.

Konsistenz der Callback-Funktion: Die Vergleichsfunktion muss konsistent und transitiv sein. Inkonsistentes Verhalten führt zu undefinierten Ergebnissen, da der interne Sortier- und Vergleichs-Algorithmus auf diese Eigenschaft angewiesen ist.