Nunca uses array_merge en un bucle

Usar array_merge dentro de un bucle mata el rendimiento. El operador spread te ayudará a mejorar esto aplanando el array.
Aplanando un array de un nivel
He visto gente usando la función array_merge en un bucle como:
<?php
$lists = [
[1, 2],
[3, 4],
[5, 6],
];
$merged = [];
foreach($lists as $list) {
$merged = array_merge($merged, $list);
}
// $merged === [1, 2, 3, 4, 5, 6];
¡Esta es una muy mala práctica porque mata el rendimiento (de memoria)! En su lugar, deberías usar el operador spread (¡en PHP desde 5.6!):
<?php
$lists = [
[1, 2],
[3, 4],
[5, 6],
];
$merged = array_merge(...$lists);
// === [1, 2, 3, 4, 5, 6];Desempaquetando un array asociativo
¿Y si tuvieras un array asociativo como este?
<?php
$lists = [
'key-1' => [1, 2],
'key-2' => [3, 4],
'key-3' => [5, 6],
];
En ese caso, necesitarás desempaquetar sus valores:
<?php
$merged = array_merge(...array_values($lists));
// === [1, 2, 3, 4, 5, 6];
En Programación Funcional, esto se conoce como aplanar una lista. Sin bucles y sin más problemas de rendimiento.
Aplanando un array multinivel
¿Y si quisieras aplanar un array multinivel como este?
<?php
$lists = [[1], 2, [[3, 4], 5], [[[]]], [[[6]]], 7, 8, []];
¿O como este, incluso con clave-valores?
<?php
$lists = [
'key-1' => [
1,
[2],
'key-2' => [
3,
[
'key-3' => [4, 5],
],
],
],
6,
'key-4' => [7, 8],
];
En estos casos, podrías querer usar la librería estándar interna:
<?php
$merged = iterator_to_array(
new RecursiveIteratorIterator(
new RecursiveArrayIterator($lists)
),
$use_keys = false
);
// $merged === [1, 2, 3, 4, 5, 6, 7, 8];Conclusión
Normalmente, ser consciente de cómo aplanar un array de “2 niveles” puede ser suficiente:
<?php
$flattenList = array_merge(...array_values($lists));
De lo contrario, la librería estándar interna te ayudará a lidiar con ello.