Die PHP-Funktion array_intersect_ukey() verstehen
Erfahren Sie, wie array_intersect_ukey() in PHP Arrays anhand benutzerdefinierter Schlüsselvergleiche filtert und welche Fallstricke es gibt.
Die Funktion array_intersect_ukey() vergleicht die Schlüssel von zwei oder mehr arrays mithilfe eines selbst definierten Callbacks und gibt die Einträge des ersten array zurück, deren Schlüssel in jedem anderen array vorhanden sind. Das u im Namen steht für benutzerdefinierter Vergleich — sie ist die schlüsselbewusste Schwester von array_intersect_key(), mit dem Unterschied, dass Sie bestimmen, wann zwei Schlüssel als „gleich" gelten.
Diese Seite erklärt, was die Funktion zurückgibt, wie der Vergleichs-Callback das Ergebnis steuert und welche Fallstricke es zu beachten gibt.
Wann sollte ich sie verwenden?
Greifen Sie auf array_intersect_ukey() zurück, wenn Sie nur die Einträge behalten möchten, deren Schlüssel übereinstimmen, einfache Schlüsselgleichheit jedoch nicht ausreicht. Typische Anwendungsfälle:
- Schlüsselabgleich ohne Berücksichtigung der Groß-/Kleinschreibung —
Hostundhostals denselben Schlüssel behandeln. - Normalisierte Schlüssel — Leerzeichen, Präfixe oder Formatierungsunterschiede vor dem Vergleich ignorieren.
- Filtern eines Konfigurations- oder Anfrage-arrays auf Schlüssel, die auch in einer Whitelist zulässiger Schlüssel vorkommen.
Wenn Sie nur exakte Schlüsselübereinstimmungen benötigen, verwenden Sie stattdessen das einfachere eingebaute array_intersect_key() — kein Callback erforderlich.
Syntax
array_intersect_ukey(
array $array1,
array $array2,
array ...$arrays,
callable $key_compare_func
): arrayParameter & Rückgabewert
| Parameter | Beschreibung |
|---|---|
$array1 | Das array, von dem aus verglichen wird. Seine Werte landen im Ergebnis. |
$array2, ...$arrays | Ein oder mehrere arrays, gegen deren Schlüssel verglichen wird. |
$key_compare_func | Das letzte Argument: ein Callback, der zwei Schlüssel entgegennimmt. Er muss eine ganze Zahl kleiner als, gleich oder größer als 0 zurückgeben, wenn der erste Schlüssel als kleiner, gleich bzw. größer als der zweite angesehen wird. |
Rückgabe: Ein array mit allen Schlüssel-Wert-Paaren aus $array1, deren Schlüssel in allen anderen arrays vorkommen. Ein Schlüssel stimmt überein, wenn der Callback 0 zurückgibt.
Hinweis: Die Werte stammen ausschließlich aus
$array1. Die Werte, die unter übereinstimmenden Schlüsseln in den anderen arrays gespeichert sind, werden ignoriert — nur ihre Schlüssel sind relevant.
Einfaches Beispiel
<?php
function key_compare_func($key1, $key2)
{
if ($key1 == $key2)
return 0;
else if ($key1 > $key2)
return 1;
else
return -1;
}
$array1 = ['a' => 'green', 'b' => 'brown', 'c' => 'blue', 'red' => 3];
$array2 = ['d' => 'green', 'b' => 'yellow', 'yellow' => 10, 'red' => 'game'];
$result = array_intersect_ukey($array1, $array2, 'key_compare_func');
print_r($result);
?>Ausgabe:
Array
(
[b] => brown
[red] => 3
)Der Callback vergleicht Schlüssel wie der Spaceship-Operator: Er gibt 0 nur dann zurück, wenn zwei Schlüssel gleich sind. Die Schlüssel b und red kommen in beiden arrays vor, daher werden ihre Einträge behalten — mit den Werten aus $array1 (brown und 3), nicht aus $array2.
In modernem PHP können Sie diesen Hilfs-Callback durch den Spaceship-Operator (<=>) ersetzen:
<?php
$array1 = ['a' => 'green', 'b' => 'brown', 'c' => 'blue', 'red' => 3];
$array2 = ['d' => 'green', 'b' => 'yellow', 'red' => 'game'];
$result = array_intersect_ukey(
$array1,
$array2,
fn($k1, $k2) => $k1 <=> $k2
);
print_r($result);
?>Ausgabe:
Array
(
[b] => brown
[red] => 3
)Schlüsselabgleich ohne Berücksichtigung der Groß-/Kleinschreibung
Hier zeigt der Callback seinen Nutzen. strcasecmp() gibt bereits den erwarteten Ganzzahlwert zurück (0 bei Gleichheit, unabhängig von der Schreibweise), sodass Sie ihn direkt übergeben können, um Schlüssel unabhängig von der Groß-/Kleinschreibung abzugleichen:
<?php
$config = ['Host' => 'localhost', 'PORT' => 8080, 'Debug' => true];
$defaults = ['host' => '0.0.0.0', 'port' => 80, 'timeout' => 30];
$shared = array_intersect_ukey($config, $defaults, 'strcasecmp');
print_r($shared);
?>Ausgabe:
Array
(
[Host] => localhost
[PORT] => 8080
)Host stimmt mit host überein und PORT stimmt mit port überein, obwohl sich ihre Schreibweise unterscheidet — beide bleiben erhalten. Debug hat kein Gegenstück in $defaults und wird daher entfernt. Die beibehaltenen Schlüssel und Werte entsprechen genau der Schreibweise im ersten array.
Fallstricke
- Der Callback muss bei Übereinstimmung
0zurückgeben. Ein häufiger Fehler ist das Schreiben eines Callbacks, der einen boolean zurückgibt ($k1 === $k2).true/falsewird zu1/0umgewandelt, sodass ungleiche Schlüssel versehentlich „übereinstimmen" würden. Geben Sie immer einen Drei-Wege-Vergleichs-Integer zurück. - Werte stammen nur aus dem ersten array. Wenn zwei arrays einen Schlüssel teilen, aber unterschiedliche Werte besitzen, behält das Ergebnis den Wert des ersten arrays.
- Der Callback ist das letzte Argument, auch wenn Sie drei oder mehr arrays zum Vergleich übergeben.
- Zum Vergleich sowohl von Schlüsseln als auch von Werten siehe
array_intersect_uassoc(); für die umgekehrte Operation (Schlüssel, die nicht geteilt werden) siehearray_diff_ukey().
Fazit
array_intersect_ukey() filtert ein array auf die Einträge, deren Schlüssel auch in jedem anderen array vorkommen, anhand Ihrer eigenen Definition von Schlüsselgleichheit. Verwenden Sie es für Schlüsselabgleiche ohne Berücksichtigung der Groß-/Kleinschreibung oder mit normalisierten Schlüsseln; greifen Sie auf array_intersect_key() zurück, wenn exakter Abgleich ausreicht. Die wichtigste Regel: Der Callback muss bei gleichen Schlüsseln 0 zurückgeben, und die resultierenden Werte stammen immer aus dem ersten array.