W3docs

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() einen TypeError. (In PHP 7 wurde eine Warnung ausgegeben und null zurückgegeben.) Der Aufruf von array_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

php— editable, runs on the server

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 color kommt 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 2 und 4 aus $array1 sowie die 4 aus $array2 wurden alle beibehalten (nichts wurde überschrieben) und mit 0, 1, 4 neu 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

php— editable, runs on the server

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 02 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

php— editable, runs on the server

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

php— editable, runs on the server

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:

Übungen

Übung
Was trifft auf die array_merge-Funktion in PHP zu?
Was trifft auf die array_merge-Funktion in PHP zu?
Was this page helpful?