2010-04-16 24 views
38

Recientemente aprendí cómo unir 2 matrices utilizando el operador + en PHP.No se pueden concatenar 2 matrices en PHP

Pero considere este código ...

$array = array('Item 1'); 

$array += array('Item 2'); 

var_dump($array); 

salida es

array (1) {[0] => string (6) "Artículo 1"}

¿Por qué esto no funciona? Omitir la taquigrafía y usar $array = $array + array('Item 2') tampoco funciona. ¿Tiene algo que ver con las llaves?

+0

* (relacionado) * http://stackoverflow.com/questions/2140090/operator-for-array-in-php/2140094#2140094 – Gordon

Respuesta

88

Ambos tendrán una clave de 0, y ese método de combinar las matrices colapsará los duplicados. Intenta usar array_merge() en su lugar.

$arr1 = array('foo'); // Same as array(0 => 'foo') 
$arr2 = array('bar'); // Same as array(0 => 'bar') 

// Will contain array('foo', 'bar'); 
$combined = array_merge($arr1, $arr2); 

Si los elementos en la matriz utilizan diferentes teclas, el operador + sería más apropiado.

$arr1 = array('one' => 'foo'); 
$arr2 = array('two' => 'bar'); 

// Will contain array('one' => 'foo', 'two' => 'bar'); 
$combined = $arr1 + $arr2; 

Editar: Se ha añadido un fragmento de código para aclarar

+12

Tenga en cuenta que la función array_merge aún colapsará los duplicados de las teclas de matriz no numéricas. ej. array_merge (array ("color" => "rojo"), array ("color" => "verde")) producirá el valor de array ("color" => "verde); –

+0

$ arr1 = array (' foo '); // Igual que array (0 =>' foo ') $ arr2 = array (' bar '); // Igual que array (0 =>' bar ') // Contendrá array (' bar '); $ combined = array_merge ($ arr1, $ arr2); –

-3

intente decir

$array[] = array('Item 2'); 

Aunque parece que está intentando añadir una matriz en una matriz, por lo tanto $array[][] pero eso no es lo que sugiere su título.

+2

No es lo mismo. Obtendrás 'array ('Item 1', array ('Item 2'))', una matriz multidimensional. – deceze

+1

Correcto, que es lo que pensé que quería. –

7

Uso array_merge()
Consulte la documentación aquí:
http://php.net/manual/en/function.array-merge.php

fusiona los elementos de una o más matrices de modo tal que los valores de uno se anexan al final del anterior. Devuelve la matriz resultante.

3

Pruebe array_merge.

$array1 = array('Item 1'); 

$array2 = array('Item 2'); 

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

Creo que es porque no se está asignando una clave para cualquiera de los dos, por lo que ambos tienen clave de 0, y el + no reindexada, por lo que su tratando a más de escribirlo.

2
$array = array('Item 1'); 

array_push($array,'Item 2'); 

o

$array[] = 'Item 2'; 
6

+ se llama el operador de la Unión, que se diferencia de un operador de concatenación (PHP no tiene uno para matrices). El description claramente dice:

El operador + añade elementos de las llaves restantes desde la derecha matriz entregado a la mano izquierda, mientras que las claves duplicadas no se sobrescriben.

Con el ejemplo:

$a = array("a" => "apple", "b" => "banana"); 
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry"); 
$c = $a + $b; 

array(3) { 
    ["a"]=> 
    string(5) "apple" 
    ["b"]=> 
    string(6) "banana" 
    ["c"]=> 
    string(6) "cherry" 
} 

Dado que ambas matrices tienen una entrada con la tecla 0, se espera el resultado.

Para concatenar, utilice array_merge.

2

Es de hecho un conflicto clave. Al concatenar matrices, las claves duplicadas no se sobrescriben.

su lugar, debe utilizar array_merge()

$array = array_merge(array('Item 1'), array('Item 2')); 
6

Todas las respuestas anteriores son incorrectas! merge realmente combina las matrices, es decir, si las matrices tienen un elemento común, una de las copias se omitirá. Lo mismo vale para unión.

No he encontrado una "solución temporal" para este problema, pero realmente hacerlo manualmente ...

aquí va:

<?php 
$part1 = array(1,2,3); 
echo "array 1 = \n"; 
print_r($part1); 
$part2 = array(4,5,6); 
echo "array 2 = \n"; 
print_r($part2); 
$ans = NULL; 
for ($i = 0; $i < count($part1); $i++) { 
    $ans[] = $part1[$i]; 
} 
for ($i = 0; $i < count($part2); $i++) { 
    $ans[] = $part2[$i]; 
} 
echo "after arrays concatenation:\n"; 
print_r($ans); 
?> 
+12

Esto es falso. 'array_merge' solo omitirá elementos de la matriz resultante si son _associative_ arrays con las mismas claves. Para matrices numéricas, _all_ items son se fusionó en una nueva matriz, cuya longitud es la suma exacta de las matrices originales. En el ejemplo, está utilizando matrices numéricas, lo que significa que 'array_merge' funcionaría sin problemas para usted. Acepto que' array_merge' no debe utilizarse para matrices asociativas, pero claramente eso no es lo que estás mostrando aquí . – JMTyler

+0

@JMTyler +1 ¡excelente comentario! Debería haber elegido un ejemplo que use matrices asociativas. La razón principal por la que publiqué esta respuesta fue porque la respuesta aceptada usa '+' que no debe usarse en ninguno de los casos (asociativo o no) a menos que las claves sean diferentes. Y array_merge que contendrá elementos duplicados en caso de artículos idénticos. – alfasin

+1

"Todas las respuestas anteriores son incorrectas" no es útil ya que las respuestas se reordenan según los votos. –

-5

puede utilizar el operador. $ array3 = $ array1. $ Array2;

+2

Ese es un operador de concat. Usted terminaría con un par de avisos y "ArrayArray". –

Cuestiones relacionadas