2011-06-30 32 views
46

Tengo dos arreglos como:combinar dos matrices

array( 
'11' => '11', 
'22' => '22', 
'33' => '33', 
'44' => '44' 
); 

array( 
'44' => '44', 
'55' => '55', 
'66' => '66', 
'77' => '77' 
); 

quiero combinar estos dos matriz de modo que no contiene duplicados y, así como mantener sus llaves originales. Por ejemplo, la salida debe ser:

array( 
'11' => '11', 
'22' => '22', 
'33' => '33', 
'44' => '44', 
'55' => '55', 
'66' => '66', 
'77' => '77' 
); 

He intentado esto pero está cambiando sus llaves originales:

$output = array_unique(array_merge($array1 , $array2)); 

Cualquier solución?

Respuesta

92

sólo tiene que utilizar:

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

Eso debe resolverlo. Debido a que utiliza claves de cadena si una clave aparece más de una vez (como '44' en su ejemplo), una tecla sobrescribirá las que tienen el mismo nombre. Porque en su caso ambos tienen el mismo valor de todos modos, no importa y también eliminará los duplicados.

Actualización: Me acabo de dar cuenta, de que trata la cadena PHP-teclas numéricas como números (enteros) y también lo hará comportarse así, lo que significa, que vuelve a numerar las llaves también ...

Una solución consiste en recrear las llaves.

$output = array_combine($output, $output); 

Actualización 2: Siempre me olvido, que también es un operador (en negrita, ya que este es realmente lo que busca!: D)

$output = $array1 + $array2; 
+3

@KingCrunch - Aunque los números se citan, esos son ** no ** claves de cadena, por lo que el índice ** ** no se conservará. Ejemplo: https://ideone.com/I2NFT –

+0

Realmente ... Primero quería hablar sobre "un error", pero luego me di cuenta de que el manual solo habla de "teclas numéricas", no de "teclas enteras". Se siente un poco confuso. – KingCrunch

+0

+1 ¡Me olvidé del operador! Excelente (pon esa parte en negrita!;)) –

4

Para hacer esto, puede recorrer una y anexar a la otra:

<?php 

$test1 = array( 
'11' => '11', 
'22' => '22', 
'33' => '33', 
'44' => '44' 
); 

$test2 = array( 
'44' => '44', 
'55' => '55', 
'66' => '66', 
'77' => '77' 
); 


function combineWithKeys($array1, $array2) 
{ 
    foreach($array1 as $key=>$value) $array2[$key] = $value; 
    asort($array2); 
    return $array2; 
} 

print_r(combineWithKeys($test1, $test2)); 

?> 

ACTUALIZACIÓN: KingCrunch ocurrió la best solution: print_r($array1+$array2);

22

Esto funciona:

$output = $array1 + $array2; 
+3

No lo recomendaría esto porque su comportamiento es muy poco intuitivo, por ejemplo '[1,2,3] + [4,5,6] == [1,2,3]' – jchook

+0

@jchook ¿Qué recomiendas entonces? – Michas

+0

Esto es lo que necesitaba, gracias. He aquí por qué: 'http_build_query (array_merge ($ array1, $ array2))' no funcionó para mí, mientras que 'http_build_query ($ array1 + $ array2)' lo hizo. – BarryMode

2

Esto funciona:

$a = array(1 => 1, 2 => 2, 3 => 3); 
$b = array(4 => 4, 5 => 5, 6 => 6); 
$c = $a + $b; 
print_r($c); 
20

que debe tomar para consideración que $array1 + $array2 != $array2 + $array1

$array1 = array(
'11' => 'x1', 
'22' => 'x1' 
); 

$array2 = array(
'22' => 'x2', 
'33' => 'x2' 
); 

con $ array1 + $ matriz2

$array1 + $array2 = array(
'11' => 'x1', 
'22' => 'x1', 
'33' => 'x2' 
); 

y con $ matriz2 + $ array1

$array2 + $array1 = array( 
'11' => 'x1', 
'22' => 'x2', 
'33' => 'x2' 
); 
1

Advertencia!$ Matriz1 + $ matriz2 sobrescribe llaves, así que mi solución (para matrices multidimensionales) es utilizar array_unique()

array_unique(array_merge($a, $b), SORT_REGULAR); 

Aviso:

5.2.10+ cambiado el valor por defecto de sort_flags volver a SORT_STRING.

5.2.9 El valor predeterminado es SORT_REGULAR.

5.2.8- defecto se SORT_STRING

Se perfectly works. Espero que ayude lo mismo.

+1

'array_merge()' no conserva las claves. La matriz creada por eso está 0 indexada. – HPierce

+0

@HPierce bien, en caso de suma de matriz multidimensional, se perderá cierta información con '+'. Eche un vistazo a: [PHPFiddle] (https://www.tehplayground.com/dHlrF78YWWh5jC8H), $ b [0] se perderá ... –