Nunca use ‘array_merge’ en un bucle
array_merge. El operador extendido al rescate.
array_merge
Aplanar una matriz de un nivel
He visto gente usando la función array_merge
en un ciclo como:
$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 es un asesino del rendimiento (de la memoria).
En su lugar, debe usar el operador de propagación (¡en PHP desde 5.6!):
$lists = [ [1, 2], [3, 4], [5, 6], ];$merged = array_merge(...$lists); // === [1, 2, 3, 4, 5, 6];
Desembalaje de una matriz asociada
¿Qué pasaría si tuvieras un assoc-array en su lugar como este?
$lists = [ 'key-1' => [1, 2], 'key-2' => [3, 4], 'key-3' => [5, 6], ];
En ese caso, deberá descomprimir sus valores:
$merged = array_merge(...array_values($lists)); // === [1, 2, 3, 4, 5, 6];
En Programación funcional, esto se conoce como aplanamiento de una lista.
Sin bucles y sin problemas de rendimiento.
Aplanar una matriz multinivel
¿Qué pasaría si quisieras aplanar una matriz multinivel como esta?
$lists = [[1], 2, [[3, 4], 5], [[[]]], [[[6]]], 7, 8, []];
¿O como este, incluso con pares clave-valor?
$lists = [ 'key-1' => [ 1, [2], 'key-2' => [ 3, [ 'key-3' => [4, 5], ], ], ], 6, 'key-4' => [7, 8], ];
En estos casos, es posible que desee utilizar la biblioteca estándar interna:
$merged = iterator_to_array( new RecursiveIteratorIterator( new RecursiveArrayIterator($lists) ), $use_keys = false );// $merged === [1, 2, 3, 4, 5, 6, 7, 8];
Conclusión
Por lo general, ser consciente de cómo aplanar una matriz de “2 niveles” puede ser suficiente:
$flattenList = array_merge(...array_values($lists));
De lo contrario, la biblioteca estándar interna lo ayudará a lidiar con eso.
Referencias
https://wiki.php.net/rfc/spread_operator_for_array