array_merge: prohibido usarlo en bucles

[vc_row el_class=”blog-info”][vc_column][vc_single_image source=”featured_image” img_size=”full” style=”vc_box_rounded”][vc_empty_space height=”40px”][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text el_class=”font-weight-bold”]

Nunca use ‘array_merge’ en un bucle

array_merge. El operador extendido al rescate.

[/vc_column_text][vc_empty_space height=”40px”][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text]

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

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row el_class=”social-info”][vc_column width=”1/6″][/vc_column][vc_column width=”2/3″][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text][social_share_button themes=’theme1′][/vc_column_text][/vc_column_inner][vc_column_inner el_class=”youtube-inner-col” width=”1/2″][vc_column_text][likebtn theme=”youtube” lang=”auto” show_like_label=”0″ white_label=”1″ alignment=”right”][/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner el_class=”social-info-inner”][vc_column_inner width=”1/4″][vc_single_image image=”921″][/vc_column_inner][vc_column_inner width=”3/4″][vc_column_text]

Diego Pacheco

Ingeniero en Sitemas, MBA (Babson College). Desarrollador PHP/Java/JavaScript. Fundador & CEO de EpicStudio. Entusiasta de las tecnologías web (JavaScript, Vue, Laravel, AWS, Docker) Viajes, Negocios, Surf y Growth.[/vc_column_text][asvc_list_item icon_fontawesome=”fa fa-calendar-o” icon_size=”14px”]Programar una reunión[/asvc_list_item][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=”1/6″][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Recent Post

[/vc_column_text][lvca_posts_carousel posts_query=”size:3|order_by:rand|post_type:post” image_linkable=”true” image_size=”full” taxonomy_chosen=”post_tag” display_title=”true” display_post_date=”true” display_summary=”true” autoplay_speed=”3000″ animation_speed=”300″ display_columns=”3″ scroll_columns=”3″ gutter=”3″ tablet_display_columns=”2″ tablet_scroll_columns=”2″ tablet_gutter=”3″ tablet_width=”800″ mobile_display_columns=”1″ mobile_scroll_columns=”1″ mobile_gutter=”3″ mobile_width=”480″][vc_empty_space height=”20px”][/vc_column][/vc_row]