PHP Array Merge: Ein ausführlicher Leitfaden
Die PHP-Funktion array_merge() kombiniert zwei oder mehr Arrays zu einem einzigen Array. Dieser Leitfaden erklärt String-Schlüssel, numerische Schlüssel und mehr.
Die PHP-Funktion array_merge() kombiniert zwei oder mehr Arrays zu einem einzigen array. Sie nimmt ein oder mehrere Arrays als Argumente entgegen und gibt ein neues array zurück; die ursprünglichen Arrays bleiben unverändert. Dieser Leitfaden erklärt, wie array_merge() mit string-Schlüsseln, numerischen Schlüsseln und verschachtelten Arrays umgeht, welche Fallstricke es zu beachten gilt und wie sie sich vom +-Vereinigungsoperator unterscheidet.
Die zwei Regeln, die fast jedes Ergebnis erklären, sind:
- String-Schlüssel, die in mehr als einem array vorkommen, werden überschrieben — der Wert aus dem späteren array gewinnt.
- Numerische Schlüssel werden niemals überschrieben. Jeder Wert wird angehängt und die Schlüssel werden sequenziell neu indiziert, beginnend bei
0.
Hinweis: Ab PHP 8.0 wirft das Übergeben eines Nicht-array-Arguments an
array_merge()einenTypeError. (In PHP 7 wurde eine Warnung ausgegeben undnullzurückgegeben.) Der Aufruf vonarray_merge()ohne Argumente gibt ein leeres array zurück.
Grundlegende Verwendung von array_merge()
Die grundlegende Verwendung der Funktion array_merge() ist unkompliziert. Einfach zwei oder mehr Arrays als Argumente übergeben, und die Funktion gibt ein neues array zurück, das das Ergebnis der Zusammenführung der Arrays ist. Hier ist ein Beispiel:
PHP array_merge Funktionsbeispiel
Ausgabe:
Array
(
[color] => green
[0] => 2
[1] => 4
[2] => a
[3] => b
[shape] => rectangle
[4] => 4
)Zwei Dinge fallen in der Ausgabe auf:
- Der string-Schlüssel
colorkommt in beiden Arrays vor, daher hat der Wert von$array2(green) den Wert von$array1(red) überschrieben. - Die numerischen Schlüssel wurden nicht beibehalten. Die ursprünglichen
2und4aus$array1sowie die4aus$array2wurden alle beibehalten (nichts wurde überschrieben) und mit0,1,4neu nummeriert.
Neuindizierung numerischer Schlüssel
Da numerische Schlüssel neu nummeriert werden, kann man nicht darauf vertrauen, dass die ursprünglichen ganzzahligen Schlüssel nach einer Zusammenführung erhalten bleiben. Sogar der Aufruf von array_merge() auf einem einzigen array ist eine gängige und schnelle Methode zur Neuindizierung:
<?php
$nums = [10 => "a", 25 => "b", 7 => "c"];
$result = array_merge($nums);
print_r($result);
?>Ausgabe:
Array
(
[0] => a
[1] => b
[2] => c
)Wenn spezifische ganzzahlige Schlüssel beibehalten werden müssen, verwendet man stattdessen den +-Vereinigungsoperator oder array_replace().
Zusammenführen mehrdimensionaler Arrays
Die Funktion array_merge() kann auch zum Zusammenführen mehrdimensionaler Arrays verwendet werden. Dazu übergibt man einfach jedes array als Argument an die Funktion. Hier ist ein Beispiel:
PHP Zusammenführen mehrdimensionaler Arrays mit array_merge_recursive
Ausgabe:
Array
(
[color] => Array
(
[favorite] => green
)
[0] => 2
[1] => 4
[2] => a
[3] => b
[shape] => rectangle
[4] => 4
)Beachte, dass array_merge() verschachtelte Arrays nicht zusammenführt. Wenn zwei Arrays einen string-Schlüssel teilen, dessen Wert selbst ein array ist, ersetzt der verschachtelte Wert des späteren Arrays den früheren vollständig — hier hat ["favorite" => "green"] einfach ["favorite" => "red"] überschrieben. Um verschachtelte Arrays rekursiv zusammenzuführen statt sie zu überschreiben, verwendet man array_merge_recursive().
array_merge() vs. der Vereinigungsoperator
PHP bietet auch den +-Vereinigungsoperator zum Kombinieren von Arrays, der sich jedoch sehr von array_merge() unterscheidet. Der Vereinigungsoperator behält den Wert des linken Operanden bei Schlüsselkollisionen und indiziert niemals numerische Schlüssel neu.
<?php
$array1 = ["a", "b", "c"];
$array2 = ["x", "y", "z", "w"];
print_r(array_merge($array1, $array2)); // appends + reindexes
print_r($array1 + $array2); // keeps left, no reindex
?>Ausgabe:
Array
(
[0] => a
[1] => b
[2] => c
[3] => x
[4] => y
[5] => z
[6] => w
)
Array
(
[0] => a
[1] => b
[2] => c
[3] => w
)Mit array_merge() wird jedes Element beibehalten und neu nummeriert. Mit + existierten die Indizes 0–2 bereits in $array1, daher gewinnen diese, und nur Index 3 (w) wird aus $array2 übernommen. Man greift auf + zurück, wenn fehlende Schlüssel aufgefüllt werden sollen (z. B. beim Zusammenführen von Benutzeroptionen über Standardwerte), während bestehende Werte und ganzzahlige Schlüssel erhalten bleiben; man greift auf array_merge() zurück, wenn eine flache, sequenziell indizierte Liste gewünscht wird. Weitere Informationen finden sich unter PHP-Operatoren.
Zusammenführen eines indizierten Arrays mit einem assoziativen Array
Beim Zusammenführen eines indizierten Arrays mit einem assoziativen array werden die Werte aus beiden Arrays kombiniert. Hier ist ein Beispiel:
PHP-Beispiel für das Zusammenführen eines indizierten Arrays mit einem assoziativen array mittels array_merge
Ausgabe:
Array
(
[0] => a
[1] => b
[2] => c
[a] => apple
[b] => banana
[c] => cherry
)Wie zu sehen ist, werden die Werte aus beiden Arrays kombiniert. Da die Schlüssel unterschiedliche Typen haben (numerisch vs. string), erfolgt kein Überschreiben. Dies ist ein wichtiges Detail, das beim Zusammenführen von Arrays mit unterschiedlichen Schlüsseltypen zu beachten ist.
Zusammenführen eines assoziativen Arrays mit einem indizierten Array
Das Ergebnis des Zusammenführens eines assoziativen Arrays mit einem indizierten array ist ähnlich. Die Werte werden kombiniert und die Schlüssel entsprechend ihrem Typ beibehalten. Hier ist ein Beispiel:
PHP Zusammenführen eines assoziativen Arrays mit einem indizierten array mittels array_merge
Ausgabe:
Array
(
[a] => apple
[b] => banana
[c] => cherry
[0] => a
[1] => b
[2] => c
)Wie gezeigt, werden die Werte ohne Konflikte kombiniert. String-Schlüssel aus $array1 bleiben erhalten, während numerische Schlüssel aus $array2 ab 0 neu indiziert werden.
Überlegungen zur Performance
Die Funktion array_merge() hat eine lineare Zeitkomplexität, was bedeutet, dass die Zeit zum Zusammenführen von Arrays linear mit der Größe der Arrays wächst. Aus diesem Grund ist es wichtig, die Anzahl der zusammenzuführenden Arrays auf ein Minimum zu beschränken und die Funktion nicht auf extrem großen Arrays zu verwenden.
Fazit
Die Funktion array_merge() ist ein vielseitiges Werkzeug zum Kombinieren von Arrays in PHP. Die zwei Kernregeln sind zu beachten: string-Schlüssel werden von späteren Arrays überschrieben, während numerische Schlüssel angehängt und ab 0 neu indiziert werden. Wenn diese Standardverhaltensweisen nicht passen, sollte stattdessen eine verwandte Funktion gewählt werden:
array_merge_recursive()— führt verschachtelte Arrays zusammen, anstatt sie zu überschreiben.array_replace()— ersetzt Werte nach Schlüssel und behält numerische Schlüssel bei.- Der
+-Vereinigungsoperator — behält linksseitige Werte und indiziert niemals neu. array_combine()— erstellt ein array aus einem separaten Schlüssel-array und einem Werte-array.