[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
[/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]
