array_merge($a, $b) devuelve un array nuevo con los elementos de $a seguidos de los de $b. Las claves numéricas se renumeran desde 0; cuando los dos arrays tienen la misma clave de texto, gana el valor del array posterior. Puedes pasar tantos arrays como quieras.
array_merge() no cambia sus argumentos. Devuelve el array combinado, así que asigna el resultado: $all = array_merge($all, $more);.
Las claves numéricas se renumeran
array_merge() trata las claves enteras como posiciones, no como nombres. Cada elemento con clave entera se añade al final y recibe una clave nueva desde 0, aunque los arrays usaran los mismos números o tuvieran huecos. Es lo que quieres con listas, y una sorpresa cuando los números son IDs.
Las claves de texto que parecen enteros ('101') se guardan como enteros, así que también se renumeran. Las claves como 'id101' se quedan como están.
array_merge vs el operador +
El operador + (unión de arrays) también combina arrays, pero con la regla contraria: para cualquier clave que ya exista en el array izquierdo, gana el valor izquierdo y el derecho se descarta. Nunca renumera. Eso hace de + la forma natural de rellenar valores por defecto, y de array_merge() la forma natural de sobrescribirlos.
array_merge($a, $b) | $a + $b | |
|---|---|---|
| Misma clave de texto | valor de $b | valor de $a |
| Claves enteras | renumeradas, se conservan todos los valores | se conservan, $b pierde en los choques |
| Uso típico | unir listas, sobrescribir ajustes | rellenar valores por defecto, conservar IDs |
El último ejemplo del bloque es la trampa clásica de +: ['a', 'b'] + ['x', 'y', 'z'] da a, b, z, porque las claves 0 y 1 ya existen a la izquierda.
Sintaxis spread: [...b]
El operador spread despliega arrays dentro de un literal de array. Se comporta como array_merge(): las claves enteras se renumeran y, desde PHP 8.1, se permiten claves de texto y gana la posterior. Se lee bien cuando mezclas arrays con valores sueltos.
Para añadir un array a uno existente en el sitio, consulta array_push() con el operador spread.
Unir un array de arrays
Cuando los arrays que quieres combinar están a su vez en una lista, despliega esa lista en array_merge(). Es también la forma rápida de unir dentro de un bucle: reúne las piezas y únelas una sola vez.
Escribir $all = array_merge($all, $batch); dentro del bucle funciona, pero copia todo el array creciente en cada vuelta, lo que se vuelve lento con miles de elementos.
array_merge_recursive y array_replace
array_merge_recursive() también une los arrays anidados, pero con una clave de texto duplicada que contiene valores simples no sobrescribe: reúne los dos valores en un array nuevo. Rara vez es lo que quieres para una configuración. Ahí la herramienta adecuada suele ser array_replace_recursive(): sobrescribe los valores en todos los niveles y conserva las claves.
Lee las tres líneas de JSON de arriba abajo: array_merge() sustituyó todo el array db y perdió host, array_merge_recursive() convirtió port y debug en listas de dos elementos, y array_replace_recursive() produjo la configuración que querías.
Error frecuente: unir no elimina nada
array_merge() conserva los valores duplicados que están bajo claves distintas. Unir dos listas de etiquetas te da dos veces cada etiqueta compartida. Pasa el resultado por array_unique() y luego por array_values() para renumerarlo.
La página de array_unique explica cómo quitar duplicados de filas y arrays anidados.
Preguntas frecuentes
¿Cuál es la diferencia entre array_merge y + en PHP?
Con claves de texto duplicadas, array_merge($a, $b) se queda con el valor de $b, mientras que $a + $b se queda con el de $a. Con claves numéricas, array_merge() añade y renumera todo, mientras que + conserva las claves numéricas y descarta cualquier elemento de $b cuya clave ya exista en $a.
¿Cómo uno arrays y conservo las claves numéricas?
Usa $a + $b si debe ganar el array izquierdo, o array_replace($a, $b) si debe ganar el derecho. array_merge() siempre renumera las claves numéricas desde 0.
¿Cómo uno un array de arrays en PHP?
Despliega el array exterior en array_merge(): $all = array_merge(...$lists);. Devuelve [] con una lista vacía. Reúne primero los arrays en un bucle y únelos una sola vez al final; llamar a array_merge() dentro del bucle copia el resultado creciente cada vez.
¿Puedo usar el operador spread con claves de texto en PHP?
Sí, desde PHP 8.1. [...$a, ...$b] se comporta entonces como array_merge($a, $b): las claves numéricas se renumeran y una clave de texto posterior sobrescribe a una anterior.