Die PHP-Funktion array_intersect_uassoc() verstehen
Erfahren Sie, wie array_intersect_uassoc() in PHP Schnittmengen mit benutzerdefinierten Schlüsselvergleichen berechnet – inkl. Beispiel.
array_intersect_uassoc() berechnet die Schnittmenge von zwei oder mehr Arrays – sie gibt die Einträge des ersten Arrays zurück, deren Wert UND Schlüssel auch in jedem anderen Array vorkommen. Das Besondere an dieser Variante ist das u im Namen: Sie übergeben einen benutzerdefinierten Callback, der entscheidet, wann zwei Schlüssel als gleich gelten. Werte werden weiterhin mit PHPs eingebautem (lockerem, string-basiertem) Vergleich geprüft.
Diese Seite erklärt, wie die Funktion funktioniert, führt durch ein verifiziertes Beispiel und zeigt, wann sie anstelle der anderen array_intersect_*-Varianten eingesetzt werden sollte.
Syntax
array_intersect_uassoc(
array $array,
array ...$arrays,
callable $key_compare_func
): array$array— das Array, mit dem verglichen wird; seine Einträge erscheinen im Ergebnis....$arrays— ein oder mehrere Arrays, die mit dem ersten verglichen werden.$key_compare_func— ein Callback, der zwei Schlüssel vergleicht. Er muss eine ganze Zahl zurückgeben, die kleiner als, gleich oder größer als0ist, wenn der erste Schlüssel als kleiner als, gleich oder größer als der zweite gilt (dasselbe Vertragsmuster wie einusort-Komparator).
Die Funktion gibt ein neues Array zurück, das die übereinstimmenden Einträge aus $array enthält und dabei die ursprünglichen Schlüssel beibehält.
Wie der Schlüssel-Callback funktioniert
Anders als array_intersect_assoc(), das Schlüssel mit === vergleicht, delegiert diese Funktion den Schlüsselvergleich an Ihren Callback. Damit können Sie Übereinstimmungsregeln implementieren, die PHP nicht von Haus aus bietet – z. B. Groß-/Kleinschreibung-unempfindliche Schlüssel, Schlüssel ohne Leerzeichen oder gebietsschemabewusste Sortierung.
Beachten Sie die geteilte Verantwortung: Schlüssel werden von Ihrem Callback verglichen, aber Werte werden weiterhin von der Funktion selbst verglichen (locker, als string). Wenn Sie auch einen benutzerdefinierten Wertvergleich benötigen, verwenden Sie array_uintersect_uassoc().
Beispiel
<?php
// The callback receives two keys and must return an int:
// 0 = equal, -1 = first is smaller, 1 = first is larger.
function compareKeys($key1, $key2) {
if ($key1 === $key2) {
return 0;
}
return ($key1 > $key2) ? 1 : -1;
}
$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"];
$array2 = ["a" => "green", "yellow", "red"];
$result = array_intersect_uassoc($array1, $array2, "compareKeys");
print_r($result);
?>Ausgabe:
Array
(
[a] => green
)Nur "a" => "green" bleibt erhalten, da es der einzige Eintrag ist, dessen Schlüssel und Wert beide in $array2 vorkommen:
"b" => "brown"und"c" => "blue"— diese Schlüssel existieren nicht in$array2.0 => "red"in$array1— der Wert"red"existiert zwar in$array2, aber unter Schlüssel1, daher stimmen die Schlüssel (0vs.1) nicht überein.
Wann verwenden
Greifen Sie auf array_intersect_uassoc() zurück, wenn Sie eine schlüsselbewusste Schnittmenge benötigen und die Schlüssel eine benutzerdefinierte Übereinstimmungslogik erfordern. Ein häufiger Anwendungsfall ist der Groß-/Kleinschreibung-unempfindliche Abgleich von Header- oder Spaltennamen:
<?php
function ci_keys($k1, $k2) {
return strcasecmp((string) $k1, (string) $k2);
}
$config = ["Host" => "localhost", "Port" => 8080];
$expected = ["host" => "localhost", "PORT" => 8080];
print_r(array_intersect_uassoc($config, $expected, "ci_keys"));
?>Dies behält Host => localhost und Port => 8080, weil der Callback Host/host und Port/PORT als denselben Schlüssel behandelt, während die Werte weiterhin übereinstimmen.
Verwandte Funktionen
| Funktion | Schlüsselvergleich | Wertvergleich |
|---|---|---|
array_intersect() | ignoriert | eingebaut |
array_intersect_assoc() | === | eingebaut |
array_intersect_key() | === (nur Schlüssel) | ignoriert |
array_intersect_ukey() | Callback (nur Schlüssel) | ignoriert |
array_intersect_uassoc() | Callback | eingebaut |
array_uintersect_uassoc() | Callback | Callback |
Fazit
array_intersect_uassoc() gibt die Einträge des ersten Arrays zurück, deren Wert und Schlüssel beide in jedem anderen Array vorkommen, während Sie die Schlüsselübereinstimmung über einen benutzerdefinierten Callback steuern können. Verwenden Sie die Funktion, wenn eine assoziative Schnittmenge flexible Schlüsselregeln erfordert – etwa Groß-/Kleinschreibung-unempfindliche oder von Leerzeichen befreite Schlüssel – und beachten Sie, dass Werte weiterhin mit PHPs eingebautem Vergleich geprüft werden.