PHP Array Intersect_Assoc Funktion
Die Funktion array_intersect_assoc in PHP vergleicht Arrays und gibt nur Elemente zurück, die in allen Arrays denselben Schlüssel und Wert haben.
Die PHP-Funktion array_intersect_assoc() vergleicht zwei oder mehr Arrays und gibt nur die Einträge zurück, die in jedem Array sowohl beim Schlüssel als auch beim Wert übereinstimmen. Im Gegensatz zu array_intersect(), das Schlüssel ignoriert und nur Werte betrachtet, behält array_intersect_assoc() ein Paar nur dann, wenn derselbe Schlüssel denselben Wert in allen übergebenen Arrays enthält. Das macht sie zum richtigen Werkzeug, wenn die Position oder Bezeichnung eines Werts genauso wichtig ist wie der Wert selbst — zum Beispiel beim Vergleichen zweier Konfigurations-Arrays oder zweier nach Feldname schlüsselgebundener Zeilen.
Diese Seite behandelt die Funktionssignatur, wie der Vergleich tatsächlich funktioniert (einschließlich eines subtilen Punktes zur Wertevergleichsmethode), mehrere ausführbare Beispiele, häufige Fallstricke und verwandte Funktionen.
Syntax
array_intersect_assoc(array $array, array ...$arrays): array$array— das Basis-Array. Das Ergebnis bewahrt dessen Schlüssel und Werttypen....$arrays— ein oder mehr Arrays zum Vergleich. Es muss mindestens eines übergeben werden.
Die Funktion gibt ein neues Array zurück, das jedes key => value-Paar aus dem ersten Array enthält, dessen Schlüssel und Wert auch in allen anderen Arrays vorhanden ist.
Funktionsweise
array_intersect_assoc() durchläuft jedes key => value-Paar im ersten Array und sucht nach demselben Schlüssel in jedem anderen Array. Ein Paar überlebt nur, wenn für jedes andere Array dieser Schlüssel existiert und sein Wert gleich ist.
Ein Detail sorgt immer wieder für Verwirrung: Der Wertevergleich ist nicht strikt (===). Intern vergleicht PHP Werte als Strings, ungefähr (string) $a === (string) $b. So stimmt 1 (int) mit "1" (string) überein, weil beide zu "1" werden, aber false stimmt nicht mit 0 überein (sie werden zu "" und "0"). Schlüssel folgen, wie in PHP-Arrays üblich, den normalen Array-Schlüssel-Regeln.
Grundlegendes Beispiel
Hier ist das einzige Paar, das von beiden Arrays geteilt wird — gleicher Schlüssel, gleicher Wert — "a" => "green":
Die Ausgabe dieses Codes wäre:
Array
(
[a] => green
)"b" wird ausgeschlossen, weil die Werte abweichen (brown vs. yellow), und "c" aus demselben Grund (blue vs. red). Das bloße "red" in $array1 hat den Integer-Schlüssel 0, der in $array2 nicht vorhanden ist, weshalb es ebenfalls ausgeschlossen wird. Das ist der Unterschied zu array_intersect(), das red allein aufgrund des Werts gefunden hätte.
Drei oder mehr Arrays vergleichen
Ein Paar muss in allen Arrays übereinstimmen, um zu überleben. Ein drittes Array schränkt das Ergebnis weiter ein:
<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue");
$array2 = array("a" => "green", "b" => "yellow");
$array3 = array("a" => "green", "c" => "blue");
$result = array_intersect_assoc($array1, $array2, $array3);
print_r($result);
?>Ausgabe:
Array
(
[a] => green
)Nur "a" => "green" erscheint in jedem Array. "c" => "blue" fehlt in $array2 und wird daher verworfen.
Fallstrick: Loser Wertevergleich
Da Werte als Strings verglichen werden, können Werte gemischter Typen auf überraschende Weise übereinstimmen:
<?php
$a = array("id" => 1, "active" => false);
$b = array("id" => "1", "active" => 0);
print_r(array_intersect_assoc($a, $b));
?>Ausgabe:
Array
(
[id] => 1
)id stimmt überein, weil 1 und "1" beide zu "1" werden. Aber active wird ausgeschlossen: false wird zu "", während 0 zu "0" wird — sie sind also nicht gleich. Wenn Sie eine strikte, typbewusste Übereinstimmung benötigen, vergleichen Sie die Arrays selbst oder verwenden Sie array_uintersect_assoc() mit einem benutzerdefinierten Callback.
Wann man sie verwendet
- Beim Vergleichen assoziativer Arrays, bei denen ein Wert nur an seinem spezifischen Schlüssel bedeutungsvoll ist — Einstellungen, Formularfelder, datenbankzeilenartige Strukturen.
- Beim Ermitteln gemeinsamer Einträge zwischen zwei Momentaufnahmen derselben schlüsselgebundenen Daten.
Wenn Sie nur auf übereinstimmende Werte unabhängig vom Schlüssel achten, verwenden Sie array_intersect(). Wenn Sie nur auf übereinstimmende Schlüssel unabhängig vom Wert achten, verwenden Sie array_intersect_key(). Für die entgegengesetzte Operation — Einträge, die im ersten Array vorhanden sind, aber nicht in den anderen, verglichen nach Schlüssel und Wert — siehe array_diff_assoc().
Diagramm
Eine visuelle Darstellung, wie array_intersect_assoc() Paare filtert:
graph LR
A[Array 1: key-value pairs] -->|Compare keys & values| B[Array 2: key-value pairs]
B -->|Keep only matching pairs| C[Result Array]Fazit
array_intersect_assoc() gibt die key => value-Paare zurück, die allen übergebenen Arrays gemeinsam sind, wobei sowohl der Schlüssel als auch der (lose als String verglichene) Wert übereinstimmen müssen. Verwenden Sie sie, wenn sowohl die Bezeichnung als auch der Wert eines Eintrags übereinstimmen müssen, und bevorzugen Sie array_intersect(), array_intersect_key() oder array_uintersect_assoc(), wenn Sie nur Wert-, nur Schlüssel- oder strikte benutzerdefinierte Übereinstimmung benötigen.