PHP-Funktion: array_merge_recursive
Die Funktion array_merge_recursive in PHP kombiniert Arrays und bewahrt dabei alle Schlüssel-Wert-Paare. Erfahren Sie mehr über Syntax und Anwendung.
Die Funktion array_merge_recursive() in PHP kombiniert zwei oder mehr Arrays zu einem einzigen. Ihr besonderes Merkmal ist der Umgang mit überlappenden string-Schlüsseln: Anstatt einen späteren Wert einen früheren überschreiben zu lassen, werden beide Werte in einem Unter-array zusammengeführt, wobei die Funktion rekursiv in verschachtelte Arrays hinabsteigt. Das macht sie zum richtigen Werkzeug, wenn Sie alle Werte behalten möchten, anstatt dass das letzte Array gewinnt.
Diese Seite behandelt die Syntax und Parameter, wie die rekursive Zusammenführung tatsächlich funktioniert, wie sie sich von array_merge() unterscheidet, einen praxisnahen Anwendungsfall und die zu beachtenden Fallstricke.
Syntax
array_merge_recursive(array $array1, array ...$arrays): arrayParameter
array1: Das erste Eingabe-array....$arrays: Ein oder mehrere zusätzliche Arrays, die zusammengeführt werden sollen.
Rückgabewert
Gibt das resultierende zusammengeführte array zurück.
Wie funktioniert array_merge_recursive?
Die Funktion wendet je nach Schlüsseltyp zwei unterschiedliche Regeln an:
- String-Schlüssel, die in mehr als einem array vorkommen, werden zusammengeführt. Wenn beide Werte Skalare sind, werden sie in einem neuen Unter-array gesammelt; wenn beide Arrays sind, geht die Funktion rekursiv vor und führt sie auf der nächsten Ebene zusammen.
- Ganzzahlige (numerische) Schlüssel werden niemals überschrieben. Jedes numerisch-indizierte Element wird angehängt und neu nummeriert, sodass nichts verloren geht und das Ergebnis ab
0neu indexiert wird.
Deshalb ist die Funktion „rekursiv": Sobald sie unter demselben string-Schlüssel zwei Arrays vorfindet, steigt sie hinab und wendet dieselbe Zusammenführungslogik auf deren Inhalte an.
Hinweis: Im Gegensatz zu array_merge(), das Werte bei überlappenden string-Schlüsseln überschreibt und numerische Schlüssel neu indexiert, führt array_merge_recursive() überlappende string-Schlüssel in verschachtelte Arrays zusammen, wobei jeder Wert erhalten bleibt.
Hier ist ein Beispiel, wie array_merge_recursive funktioniert:
PHP-Beispiel der Funktion array_merge_recursive
Die Ausgabe dieses Codes lautet:
Array
(
[color] => Array
(
[favorite] => Array
(
[0] => red
[1] => green
)
[0] => blue
)
[0] => 5
[1] => 10
)Wie zu sehen ist, hat die Funktion array_merge_recursive die überlappenden Schlüssel der Eingabe-Arrays in Unter-Arrays zusammengeführt.
array_merge() vs. array_merge_recursive()
Ein direkter Vergleich der beiden Funktionen verdeutlicht den Unterschied:
<?php
$defaults = ["roles" => ["user"], "name" => "Guest"];
$overrides = ["roles" => ["editor"], "name" => "Ann"];
print_r(array_merge($defaults, $overrides));
print_r(array_merge_recursive($defaults, $overrides));
?>Array // array_merge(): later value wins
(
[roles] => Array
(
[0] => editor
)
[name] => Ann
)
Array // array_merge_recursive(): both values kept
(
[roles] => Array
(
[0] => user
[1] => editor
)
[name] => Array
(
[0] => Guest
[1] => Ann
)
)Beachten Sie, dass sogar name, ein einfacher string, zu einem array ["Guest", "Ann"] wurde. Das ist der wesentliche Fallstrick, der weiter unten behandelt wird: Rekursives Zusammenführen macht jeden wiederholten string-Schlüssel zu einer Liste, ob gewünscht oder nicht.
Wann man array_merge_recursive verwenden sollte
Greifen Sie auf diese Funktion zurück, wenn das Ziel das Sammeln von Werten ist, nicht das Auswählen eines einzigen. Ein häufiger Anwendungsfall ist das Gruppieren von Daten — zum Beispiel das Erstellen einer Zuordnung einer Kategorie zu all ihren Elementen:
<?php
$result = [];
$products = [
["category" => "fruit", "name" => "apple"],
["category" => "fruit", "name" => "pear"],
["category" => "vegetable", "name" => "carrot"],
];
foreach ($products as $product) {
$result = array_merge_recursive(
$result,
[$product["category"] => [$product["name"]]]
);
}
print_r($result);
?>Array
(
[fruit] => Array
(
[0] => apple
[1] => pear
)
[vegetable] => Array
(
[0] => carrot
)
)Fallstricke
- String-Schlüssel werden zusammengeführt, ganzzahlige Schlüssel werden angehängt. Ein wiederholter string-Schlüssel erzeugt ein Unter-array, selbst wenn beide Werte Skalare sind. Wenn Sie stattdessen möchten, dass spätere Werte frühere überschreiben, verwenden Sie
array_merge()oderarray_replace_recursive(). - Numerische Schlüssel bleiben nicht erhalten. Ganzzahlige Schlüssel werden immer ab
0neu nummeriert, sodass Siearray_merge_recursive()nicht verwenden können, um zwei Arrays anhand ihrer numerischen Schlüssel zusammenzuführen. Verwenden Sie den+-Operator (Union), wenn Sie die Schlüssel unverändert beibehalten möchten. - Die Funktion steigt nur in Arrays hinab. Wenn eine Seite ein Skalar und die andere ein array unter demselben Schlüssel ist, werden beide einfach in einer Liste gesammelt; der Skalar wird nicht in das array eingebunden.
Verwandte Funktionen
array_merge()— einfache Zusammenführung, bei der spätere string-Schlüssel frühere überschreiben.array_replace_recursive()— geht wie diese Funktion rekursiv vor, ersetzt aber Werte, anstatt sie zu sammeln.array_combine()— erstellt ein array aus einem separaten Schlüssel-array und einem Werte-array.
Fazit
Die Funktion array_merge_recursive() ist die richtige Wahl, wenn Sie Werte unter gemeinsamen string-Schlüsseln kombinieren möchten, anstatt sie zu überschreiben — zum Gruppieren, Aggregieren oder Akkumulieren von Daten über Arrays hinweg. Behalten Sie ihre zwei Regeln im Hinterkopf (string-Schlüssel werden zu Listen zusammengeführt, ganzzahlige Schlüssel werden neu indexiert), und wählen Sie array_merge() oder array_replace_recursive(), wenn Sie stattdessen das Verhalten „letzter Wert gewinnt" benötigen.