array_merge($a, $b) liefert ein neues Array mit den Elementen von $a, gefolgt von den Elementen von $b. Numerische Schlüssel werden ab 0 neu nummeriert; haben beide Arrays denselben String-Schlüssel, gewinnt der Wert aus dem späteren Array. Du kannst beliebig viele Arrays übergeben.
array_merge() ändert seine Argumente nicht. Es liefert das kombinierte Array, also weist du das Ergebnis zu: $all = array_merge($all, $more);.
Numerische Schlüssel werden neu nummeriert
array_merge() behandelt Ganzzahl-Schlüssel als Positionen, nicht als Namen. Jedes Element mit Ganzzahl-Schlüssel wird angehängt und bekommt einen frischen Schlüssel ab 0, auch wenn die Arrays dieselben Zahlen oder Lücken verwendet haben. Bei Listen ist das genau richtig, bei Zahlen, die IDs sind, eine Überraschung.
String-Schlüssel, die wie Ganzzahlen aussehen ('101'), werden als Ganzzahlen gespeichert und daher ebenfalls neu nummeriert. Schlüssel wie 'id101' bleiben, wie sie sind.
array_merge vs der Operator +
Der Operator + (Array-Vereinigung) kombiniert ebenfalls Arrays, aber mit der umgekehrten Regel: Bei jedem Schlüssel, der im linken Array schon existiert, gewinnt der linke Wert, und der rechte wird verworfen. Er nummeriert nie neu. Damit ist + der natürliche Weg, Standardwerte aufzufüllen, und array_merge() der natürliche Weg, sie zu überschreiben.
array_merge($a, $b) | $a + $b | |
|---|---|---|
| Gleicher String-Schlüssel | Wert aus $b | Wert aus $a |
| Ganzzahl-Schlüssel | neu nummeriert, alle Werte bleiben | bleiben, $b verliert bei Kollisionen |
| Typischer Einsatz | Listen verbinden, Einstellungen überschreiben | Standardwerte auffüllen, IDs behalten |
Das letzte Beispiel im Block ist die klassische Falle mit +: ['a', 'b'] + ['x', 'y', 'z'] ergibt a, b, z, weil die Schlüssel 0 und 1 links schon existieren.
Spread-Syntax: [...b]
Der Spread-Operator entpackt Arrays in einem Array-Literal. Er verhält sich wie array_merge(): Ganzzahl-Schlüssel werden neu nummeriert, und seit PHP 8.1 sind String-Schlüssel erlaubt, wobei der spätere gewinnt. Er liest sich gut, wenn du Arrays mit einzelnen Werten mischst.
Um ein Array direkt an ein bestehendes anzuhängen, siehe array_push() mit dem Spread-Operator.
Ein Array von Arrays zusammenführen
Wenn die zu kombinierenden Arrays selbst in einer Liste stehen, spreadest du diese Liste in array_merge(). Das ist auch der schnelle Weg, in einer Schleife zusammenzuführen: Teile sammeln, dann einmal zusammenführen.
$all = array_merge($all, $batch); in der Schleife funktioniert, kopiert aber bei jedem Durchlauf das ganze wachsende Array, was bei Tausenden Einträgen langsam wird.
array_merge_recursive und array_replace
array_merge_recursive() führt auch verschachtelte Arrays zusammen, überschreibt aber bei einem doppelten String-Schlüssel mit einfachen Werten nicht: Es sammelt beide Werte in einem neuen Array. Für Konfigurationen ist das selten gewollt. Dort ist meist array_replace_recursive() das richtige Werkzeug: Es überschreibt Werte auf jeder Ebene und behält die Schlüssel.
Lies die drei JSON-Zeilen von oben nach unten: array_merge() hat das ganze Array db ersetzt und host verloren, array_merge_recursive() hat port und debug in Listen mit zwei Elementen verwandelt, und array_replace_recursive() hat die Konfiguration erzeugt, die du gemeint hast.
Typischer Fehler: Zusammenführen entfernt nichts
array_merge() behält doppelte Werte, die unter verschiedenen Schlüsseln stehen. Zwei Tag-Listen zusammenzuführen gibt dir jeden gemeinsamen Tag zweimal. Schick das Ergebnis durch array_unique() und dann durch array_values(), um neu zu nummerieren.
Die Seite zu array_unique behandelt das Entfernen von Duplikaten aus Zeilen und verschachtelten Arrays.
Häufig gestellte Fragen
Was ist der Unterschied zwischen array_merge und + in PHP?
Bei doppelten String-Schlüsseln behält array_merge($a, $b) den Wert aus $b, während $a + $b den Wert aus $a behält. Bei numerischen Schlüsseln hängt array_merge() alles an und nummeriert neu, während + die numerischen Schlüssel behält und jedes Element von $b verwirft, dessen Schlüssel in $a schon existiert.
Wie führe ich Arrays zusammen und behalte die numerischen Schlüssel?
Verwende $a + $b, wenn das linke Array gewinnen soll, oder array_replace($a, $b), wenn das rechte gewinnen soll. array_merge() nummeriert numerische Schlüssel immer ab 0 neu.
Wie führe ich in PHP ein Array von Arrays zusammen?
Spreade das äußere Array in array_merge(): $all = array_merge(...$lists);. Bei einer leeren Liste liefert es []. Sammle die Arrays zuerst in einer Schleife und führe sie am Ende einmal zusammen; array_merge() in der Schleife kopiert jedes Mal das wachsende Ergebnis.
Kann ich in PHP den Spread-Operator mit String-Schlüsseln verwenden?
Ja, seit PHP 8.1. [...$a, ...$b] verhält sich dann wie array_merge($a, $b): Numerische Schlüssel werden neu nummeriert, und ein späterer String-Schlüssel überschreibt einen früheren.