2010-05-11 15 views
33

¿Podría alguien ayudarme a explicar esto? Tengo dos fragmentos de código, uno funciona como espero, pero el otro no.PHP: Agregar matrices juntas

Esto funciona

$a = array('a' => 1, 'b' => 2); 
$b = array('c' => 3); 
$c = $a + $b; 
print_r($c); 

// Output 
Array 
(
    [a] => 1 
    [b] => 2 
    [c] => 3 
) 

Esto no

$a = array('a', 'b'); 
$b = array('c'); 
$c = $a + $b; 
print_r($c); 

// Output 
Array 
(
    [0] => a 
    [1] => b 
) 

lo que está pasando aquí ?? ¿Por qué la segunda versión tampoco agrega las dos matrices juntas? ¿Qué he entendido mal? ¿Qué debería estar haciendo en su lugar? ¿O es un error en PHP?

+2

** posible duplicado de [+ operator for array in PHP?] (http://stackoverflow.com/questions/2140090/operator-for-array-in-php) ** – Gordon

+0

Su ejemplo es incorrecto. La segunda salida debe ser '1 => 'a', 2 => 'b''. – Tgr

+0

@Gordon: No, de alguna manera sabía lo que significaba el operador +, simplemente ... lo entendí mal: p – Svish

Respuesta

22

Esto está documentado y correcta: http://us3.php.net/manual/en/language.operators.array.php

El operador + añade elementos de las llaves restantes de el conjunto de la mano derecha para el zurdo, mientras que las teclas duplicadas NO se sobrescriben.

Así que supongo que no es un error en php y lo que se supone que suceda. No había notado esto antes tampoco.

+0

Se podría decir que es un defecto de diseño. 'array_merge'-ing dos matrices asociativas lleva a resultados extraños cuando algunas de las claves son numéricas (que es bastante común para las matrices que representan los registros de la base de datos). – Tgr

+1

En realidad, es por diseño y realmente útil si necesita combinar dos matrices y conservar las claves numéricas (o más bien fusionar las matrices donde las claves numéricas son significativas). Como han dicho otros aquí, debes usar array_merge(). –

20

Para sumar dos matrices no asociativos es necesario utilizar la función array_merge:

fusiona los elementos de uno o más matrices de modo tal que los valores de una son agregados al final de la el anterior. Devuelve la matriz resultante .

Si las matrices de entrada tienen las mismas claves de cadena, el valor más adelante para clave reemplazará la anterior uno. Sin embargo, si los arreglos contienen claves numéricas , el valor posterior no sobrescribirá el valor original, pero se agregará .

Si solo se proporciona una matriz y la matriz está indexada numéricamente, las claves se vuelven a indexar de forma continua.

18

a ser corto, esto funciona porque si print_r tanto $ a como $ b tiene:

Array 
(
    [a] => 1 
    [b] => 2 
) 

y

Array 
(
    [c] => 3 
) 

como se puede ver todos los elementos tienen diferentes claves ...

como para el segundo ejemplo matrices, si imprime $ ay $ b tiene:

Array 
(
    [0] => a 
    [1] => b 
) 

y

Array 
(
    [0] => c 
) 

y que la tecla 0 para los dos 'a' y 'c' es la cuestión aquí, los elementos de la segunda matriz con las mismas claves se descartarán ... si lo hace:

$c = $b + $a; // instead of $c = $a + $b; 

el resultado será:

Array 
(
    [0] => c 
    [1] => b 
) 
+1

Buena explicación visual de lo que está sucediendo. – beporter

+0

IMO, esta debería ser la respuesta aceptada. – Tyzoid

1

Al trabajar en matrices, el operador más no sobrescribe los índices, ni reindexa los arreglos. En su ejemplo, c tiene un índice 0 igual que a, por lo que se descarta. Use array_merge.

0
array_splice($a,count($a),0,$b); //array $a becomes a group of $a and $b arrays. 

P.S. es para matrices indexadas (no asociativas)