array_merge: prohibido usarlo en bucles

array_merge

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

https://rosettacode.org/wiki/Flatten_a_list

kalessil/phpinspectionsea

Recent Post