Todos los artículos
Nunca uses array_merge en un bucle

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.

blog-cover

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.


Referencias

Ssearch Dtheme Llang Jolder Knewer Ttoc Ccopy ?help

Atajos de Teclado

Navegación

HInicio
BBlog
RLecturas
LCambiar idioma

Acciones

SBuscar
DCambiar tema
CCopiar URL
GGIr arriba

Artículos

JArtículo anterior
KArtículo siguiente
TMostrar/ocultar índice

General

?Mostrar ayuda
EscCerrar