2011-03-22 10 views
82

Una pregunta bastante simple. ¿Cuál es la diferencia entre:¿Cuál es la diferencia entre array_merge y array + array?

$merged = array_merge($array1, $array2); 

y

$merged = $array1 + $array2; 

?

+5

posible duplicado de [+ operador para matriz en PHP?] (Http://stackoverflow.com/questions/2140090/operator-for-array-in-php) – Gordon

+2

probablemente Gordon, se perdió eso debido al título no teniendo array_merge en él. –

+0

sí, podría ser. NOTARIO PÚBLICO. – Gordon

Respuesta

57

La diferencia es:

El operador + toma la unión de las dos matrices, mientras que la función array_merge toma la unión PERO los duplicados de las llaves se sobreescriben).

+0

Entonces, ¿cuál es la diferencia entre estos 2: [matriz_merge] (http://codepad.org/6QdQh908), [signo más] (http://codepad.org/mu0aF3tN) (aunque tuve que cambiar las matrices) ? –

+14

Una palabra de precaución para principiantes aquí, el resultado de la operación en ambos casos es ** nulo ** si cualquiera de las matrices es ** nulo **. Puede que a algunos no les importe asumir esto, ya que es una operación sindical, el resultado será el arreglo apropiado (no nulo) si uno de ellos es ** nulo **. Pero eso es cierto si una de las matrices es una matriz vacía. Entonces, como una buena práctica, creo que deberíamos inicializar las matrices de entrada como matrices vacías. ¿Qué dicen ustedes? –

+3

Si hay claves duplicadas, "tomar la unión" siempre tendrá para deshacerse de una de ellas. La diferencia está en cuál. – alexis

43

array_merge() hace que todas las claves numéricas encontradas en las matrices de entrada sean reindexadas en la matriz resultante. El operador de unión + no causa un reindex.

5

Creo que array_merge sobrescribe claves non_numeric duplicadas, mientras que $array1 + $array2 no.

59

Aquí es un simple análisis ilustrativo:

$ar1 = [ 
    0 => '1-0', 
    'a' => '1-a', 
    'b' => '1-b' 
]; 


$ar2 = [ 
    0 => '2-0', 
    1 => '2-1', 
    'b' => '2-b', 
    'c' => '2-c' 
]; 

print_r($ar1+$ar2); 

print_r(array_merge($ar1,$ar2)); 

con el resultado:

Array 
(
    [0] => 1-0 
    [a] => 1-a 
    [b] => 1-b 
    [1] => 2-1 
    [c] => 2-c 
) 
Array 
(
    [0] => 1-0 
    [a] => 1-a 
    [b] => 2-b 
    [1] => 2-0 
    [2] => 2-1 
    [c] => 2-c 
) 

en cuenta que duplicar llaves no numéricos se llevará el primer valor con el operador de unión, pero el posterior uso de la array_merge.

Para las teclas numéricas, el primer valor se usará con el operador de unión, mientras que todos los valores se usarán con la matriz_mergen, solo se volverá a indizar.

Generalmente uso el operador de unión para matrices asociativas y array_merge para numérico. Por supuesto, también puede usar array_merge para asociativo, solo que los valores posteriores sobrescriben los anteriores.

17

El signo + solo toma el valor de la primera aparición de una clave de matriz.
array_merge toma el valor del último aparición de una clave de matriz.

Ejemplo:

$first = ['a'=>'one', 
     'b'=>'two', 
     'c'=>'three']; 

$second = ['a'=>'fourth', 
     'b'=>'fifth', 
     'c'=>'sixth', 
     '3'=>'number three']; 

$merged = $first + $second; 
echo "<pre> plus sign merge\n"; 
var_dump($merged); 

$merged = array_merge($first,$second); 
echo "\n array_merge function merge\n"; 
var_dump($merged); 

Este salidas:

signo más fusionar
array (4) {
[ "a"] =>
cadena (3) " uno "
[" b "] =>
cadena (3)" dos "
[ "c"] =>
cadena (5) "tres"
[3] =>
string (12) "número tres"
}

función array_merge funden
array (4) {
[ "a"] =>
cadena (6) "cuarto"
[ "b"] =>
cadena (5) "quinta"
[ "c"] =>
cadena (5) "sexto"
[0] =>
string (12) "número tres"
}

interesante tener en cuenta en esto es que el array_merge actally borra la ' 3 'índice del número tres a pesar de que es una cadena, porque es un número.

Tenga cuidado al combinar con array_merge matrices con índices numéricos. Podrían perder sus llaves. si son importantes para ti, prepáralos con una cuerda.

así que en vez de usar algo como '3' => 'three''_3' => 'three'

+4

"* aunque es una cadena, porque es un número *" merece un +1 :-) –

0

favor, preste atención a otra diferencia: la unión (+) no sobrescribirá valor no vacío con valor vacío (considerando una misma clave), mientras que array_merge hará lo siguiente:

$a = array('foo' => 'bar'); 
$b = array('foo' => ''); // or false or 0 

print_r($a+$b); 
print_r(array_merge($a, $b); 

Salidas:

Array 
(
    [foo] => bar 
) 
Array 
(
    [foo] => 0 
) 
2

otro ejemplo (matrices sin claves explícitas; es obvio respecto a la forma en que el operador + y array_merge trabajo, pero las cosas "obvias" son más simples cuando se ve;))

$a = array('apple'); 
$b = array('orange', 'lemon'); 

echo '$a + $b = ';    print_r($a + $b); 
echo 'array_merge($a, $b) = '; print_r(array_merge($a, $b)); 

darán:

$a + $b = Array 
(
    [0] => apple 
    [1] => lemon 
) 
array_merge($a, $b) = Array 
(
    [0] => apple 
    [1] => orange 
    [2] => lemon 
) 
0

no puedo hacer ningún comentario sobre la respuesta por lo que voy a escribir otra uno.

@ZalemCitizen es simplemente errónea, la unión (+) sobrescribirá los valores no vacíos por otros vacíos:

$a = array('foo' => 'bar'); 
$b = array('foo' => null); 

var_dump($b+$a); 
var_dump(array_merge($a, $b)); 

Salidas:

array(1) { 
    ["foo"]=> 
    NULL 
} 
array(1) { 
    ["foo"]=> 
    NULL 
} 

tener en cuenta el orden de las matrices .

Cuestiones relacionadas