Cómo unir arrays en PHP

PHP

PHP dispone de varios métodos combinar dos más arrays en uno. Puedes usar tanto las funciones array_merge o array_merge_recursive como el operador +. En este tutorial vamos a explicar estos tres métodos, así como las diferencias que existen entre ellos.

Cómo unir arrays con array_merge

Para unir dos arrays usando la función array_merge basta con pasárselos como parámetros a la función:

array_merge($array1, $array2);

Por ejemplo, vamos a usar el método array_merge con los siguientes arrays:

$array1 = [
    'a',
    'b',
];

$array2 = [
    'c',
];

$resultado = array_merge($array1, $array2);
print_r($resultado);

Obtenemos el siguiente resultado:

[
  0 => 'a',
  1 => 'b',
  2 => 'c',
 ]

Lo que hace el método array_merge es agregar los elementos del segundo array (derecho) al primero (izquierdo). Los elementos del segundo array que contengan claves numéricas se agregarán al final del primer array con una nueva clave, siguiendo el orden secuencial del primer array.

Con este ejemplo lo verás más claro:

$array1  = [];
$array2 = [
  1 => 'valor'
];
 
$resultado = array_merge($array1, $array2);
print_r($resultado);

Este sería el resultado:

[
  0 => 'valor'
]

Tal y como puedes comprobar, los elementos del segundo array cuyas claves sean numéricas se agregan al primer array con una nueva clave.

Sin embargo, los elementos del segundo array que contengan claves de tipo cadena, se agregarán al primer array conservando su clave. En caso de que dicha clave de tipo cadena ya exista en el primer array, se sobrescribirá el valor de la clave en el primer array:

$array1 = [
  'color' => 'rojo',
  2,
  4,
];
 
$array2 [
  'a',
  'b',
  'color' => 'verde',
  'forma' => 'cuadrado',
  4,
];

$resultado = array_merge($array1, $array2);
print_r($resultado);

Este sería el resultado:

[
  'color' => 'verde',
  0 => 2,
  1 => 4,
  2 => 'a',
  3 => 'b',
  'forma' => 'cuadrado',
  4 => 4
]

En caso de que quieras que los elementos del primer array no se sobrescriban por los del segundo y que a su vez, los elementos con clave numérica del segundo array no se reindexen en el primero, tendrás que usar el operador +, que veremos a continuación.

También puedes usar la función array_merge para unir más de dos arrays:

$array1 = ['a'];
$array2 = ['b'];
$array3 = ['c'];

$resultado = array_merge($array1, $array2, $array3);

Este sería el resultado:

[
    0 => 'a',
    1 => 'b',
    2 => 'c',
]

Cómo unir arrays con el operador +

Para unir dos arrays usando el operador + basta con usar el operador como si de una suma se tratase, sumando ambos elementos:

$array1 + $array2

Vamos a poner como ejemplo los siguientes arrays:

$array1 = [
    'a',
    'b',
];

$array2 = [
    'c',
];

Cuando usamos el operador + con los arrays de nuestro ejemplo, obtenemos el siguiente resultado:

$resultado = $array1 + $array2;
print_r($resultado);

Este sería el resultado:

[
  0 => 'a',
  1 => 'b',
]

Tal y como vemos, el operador + mantiene las claves del primer array. Si ahora cambiamos el orden de los operandos, obtenemos el siguiente resultado:

$resultado = $array2 + $array1;
print_r($resultado);

Este sería el resultado:

[
  0 => 'c',
  1 => 'b',
]

Esto es debido a que el operador + solamente agregará los elementos del segundo array (derecho) al primero (izquierdo) si la clave de los elementos del segundo array no existe en el primero. Por el contrario, el método array_merge sobrescribe las claves existentes en el primer array.

Este comportamiento implica que no podamos usar el operador + para unir arrays recursivamente, ya que los elementos existentes en el primer array no se modificarán:

$array1 = [
    'A' => [
        'B' => true,
        'C' => true,
    ],
];

$array2 = [
    'A' => [
        'B' => false,
        'C' => false,
    ],
];

$resultado = $array1 + $array2;
print_r($resultado);

Este sería el resultado:

[
  'A' => [
    'B' => true,
    'C' => true,
  ],
]

Si por el contrario usamos la función array_merge, obtendríamos el siguiente resultado:

[
  'A' => [
    'B' => false,
    'C' => false,
  ],
]

También puedes usar el operador + para unir más de dos arrays:

$array1 = ['a'];
$array2 = ['b'];
$array3 = ['c'];

$resultado = $array1 + $array2 + $array3;

Este sería el resultado, en el que como vemos, siempre tienen prioridad los elementos del array de la izquierda sobre el resto:

[
    0 => 'a',
]

Cómo unir arrays con array_merge_recursive

La función array_merge_recursive sirve para unir varios arrays recursivamente, conservando todos los elementos:

$array1 = [
  'A' => [
    'a' => 'rojo',
    'b' => 'verde',
  ]
];

$array2 = [
  'A' => [
    'c' => 'azul',
    'd' => 'amarillo',
  ]
];

$resultado = array_merge_recursive($array1, $array2);

print_r($resultado);

Este sería el resultado:

[
  'A' => [
    'a' => 'red',
    'b' => 'green',
    'c' => 'blue',
    'd' => 'yellow',
]

Tal y como ves, los elementos del segundo array se agregan al primero, pero no solamente se agregan los elementos de nivel superior, sino también en los arrays que contenga cada uno de los elementos.

En caso de que alguna clave se repita en ambos arrays, dicho elemento se sustituirá en el primer array por un array que contenga los valores de la clave que se repite en ambos arrays:

$array1 = [
  'A' => [
    'a' => 'rojo',
    'b' => 'verde',
  ]
];

$array2 = [
  'A' => [
    'c' => 'azul',
    'd' => 'amarillo',
  ]
];

$resultado = array_merge_recursive($array1, $array2);

Este sería el resultado:

[
  'A' => [
    'a' => [
      0 => 'red',
      1 => 'blue',
    ]
    'b' => 'green',
    'd' => 'yellow',
  ]
]

Es decir, que cuando usamos la función array_merge_recursive, se creará un array en el que se conservan los valores de ambos arrays, incluso aunque estos se repitan.

Y esto ha sido todo.


Avatar de Edu Lazaro

Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

Si quieres conocer mis proyectos, sígueme en Twitter.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

“- Hey, Doc. No tenemos suficiente carretera para ir a 140/h km. - ¿Carretera? A donde vamos, no necesitaremos carreteras.”