array_merge_recursive

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_merge_recursiveUne dos o más arrays recursivamente

Descripción

array_merge_recursive(array $array1, array $... = ?): array

array_merge_recursive() une los elementos de uno o más arrays de modo tal que los valores de uno sean añadidos al final del anterior. Devuelve el array resultante.

Si los arrays de entrada tienen las mismas claves de tipo string, los valores de estas claves son unidas en un array, y esto se realiza recursivamente, de modo que si uno de los valores es un array mismo, la función unirá también ésta con la correspondiente entrada de otro array. Sin embargo, si los arrays tienen la misma clave numérica, el valor posterior no sobrescribirá el valor original, sino que será añadido al final.

Parámetros

array1

Array inicial a unir.

...

Lista variable de arrays a unir recursivamente.

Valores devueltos

Un array de valores resultante de la unión de los argumentos.

Ejemplos

Ejemplo #1 Ejemplo de array_merge_recursive()

<?php
$m1
= array("color" => array("favorito" => "rojo"), 5);
$m2 = array(10, "color" => array("favorito" => "verde", "azul"));
$resultado = array_merge_recursive($m1, $m2);
print_r($resultado);
?>

El resultado del ejemplo sería:

Array
(
    [color] => Array
        (
            [favorito] => Array
                (
                    [0] => rojo
                    [1] => verde
                )

            [0] => azul
        )

    [0] => 5
    [1] => 10
)

Ver también

add a note

User Contributed Notes 1 note

up
175
gabriel dot sobrinho at gmail dot com
16 years ago
I refactored the Daniel's function and I got it:

<?php
/**
* array_merge_recursive does indeed merge arrays, but it converts values with duplicate
* keys to arrays rather than overwriting the value in the first array with the duplicate
* value in the second array, as array_merge does. I.e., with array_merge_recursive,
* this happens (documented behavior):
*
* array_merge_recursive(array('key' => 'org value'), array('key' => 'new value'));
* => array('key' => array('org value', 'new value'));
*
* array_merge_recursive_distinct does not change the datatypes of the values in the arrays.
* Matching keys' values in the second array overwrite those in the first array, as is the
* case with array_merge, i.e.:
*
* array_merge_recursive_distinct(array('key' => 'org value'), array('key' => 'new value'));
* => array('key' => array('new value'));
*
* Parameters are passed by reference, though only for performance reasons. They're not
* altered by this function.
*
* @param array $array1
* @param array $array2
* @return array
* @author Daniel <daniel (at) danielsmedegaardbuus (dot) dk>
* @author Gabriel Sobrinho <gabriel (dot) sobrinho (at) gmail (dot) com>
*/
function array_merge_recursive_distinct ( array &$array1, array &$array2 )
{
$merged = $array1;

foreach (
$array2 as $key => &$value )
{
if (
is_array ( $value ) && isset ( $merged [$key] ) && is_array ( $merged [$key] ) )
{
$merged [$key] = array_merge_recursive_distinct ( $merged [$key], $value );
}
else
{
$merged [$key] = $value;
}
}

return
$merged;
}
?>

This fix the E_NOTICE when the the first array doesn't have the key and the second array have a value which is a array.
To Top