Combinar dos matrices

88

Tengo dos matrices como esta:

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

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

Quiero combinar estos dos arreglos de manera que no contenga duplicados y también conserve sus claves originales. Por ejemplo, la salida debería ser:

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

He intentado esto pero está cambiando sus claves originales:

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

¿Alguna solución?

Awan
fuente

Respuestas:

161

Solo usa:

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

Eso debería solucionarlo. Porque usa claves de cadena si una clave ocurre más de una vez (como'44' en su ejemplo), una clave sobrescribirá las de procedimiento con 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 PHP trata las claves de cadena numéricas como números (enteros) y, por lo tanto, se comportará así, lo que significa que también renumera las claves ...

Una solución alternativa es volver a crear las claves.

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

Actualización 2: Siempre me olvido, que también hay un operador (en negrita, ¡porque esto es realmente lo que estás buscando!: D)

$output = $array1 + $array2;

Todo esto se puede ver en: http://php.net/manual/en/function.array-merge.php

KingCrunch
fuente
5
@KingCrunch: aunque los números se citan, no son claves de cadena y, por lo tanto, el índice no se conservará. Ejemplo: ideone.com/I2NFT
Brendan Bullen
1
Realmente ... Primero quería hablar de "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
+1 ¡Me olvidé del operador! Excelente (¡ponga esa parte en negrita!;))
Brendan Bullen
3
Entonces $array1 + $array2es una solución corta y eficiente en lugar de una array_merge() - array_combine()combinación
Awan
2
¡ADVERTENCIA! para matrices no asociadas o si las matrices tienen claves comunes$a + $b != array_merge($a, $b)
jmarceli
33

Debes tener en cuenta que $array1 + $array2 != $array2 + $array1

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

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

con $ matriz1 + $ matriz2

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

y con $ array2 + $ array1

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

Esto funciona:

$output = $array1 + $array2;
Michas
fuente
12
No recomendaría esto porque su comportamiento es muy poco intuitivo, por ejemplo[1,2,3] + [4,5,6] == [1,2,3]
jchook
@jchook ¿Qué recomiendas entonces?
Michas
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)sí.
BarryMode
4

Para hacer esto, puede recorrer uno y agregar al otro:

<?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 ideó la mejor solución :print_r($array1+$array2);

Brendan Bullen
fuente
2

Si está utilizando PHP 7.4 o superior, puede utilizar el operador de propagación ...como los siguientes ejemplos de PHP Docs:

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

Funciona como en JavaScript ES6.

Más información en https://wiki.php.net/rfc/spread_operator_for_array .

Estudiante de ciencias
fuente
Esto no es aplicable a la pregunta. El OP tiene claves de cadena para la matriz (eso no funciona con el operador de propagación) y el OP quiere conservar las claves (el operador de propagación tira las claves). Además, OP no quiere duplicados.
martti
Oh, veo tus puntos. Eso es cierto y tienes razón. ¿Puede proporcionarnos algún código que nos ayude a mejorar mi respuesta para otras personas? ¡Agradecería tu tiempo! Muchas gracias por señalar los inconvenientes de mi respuesta.
Estudiante de Ciencias
No creo que el operador de propagación sea el camino a seguir aquí. En su lugar, use la respuesta dada$array1 + $array2
martti
¡No estaba al tanto de esto! Quiero decir, no sabía que podíamos hacer $ouput = $array1 + $array2. ¡Ahora he aprendido algo nuevo! ¡Gracias!
Estudiante de Ciencias
1

Esto funciona:

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

¡Advertencia! $ array1 + $ array2 sobrescribe las claves, por lo que mi solución (para matrices multidimensionales) es usar array_unique ()

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

Darse cuenta:

5.2.10+ Se cambió el valor predeterminado de sort_flagsback a SORT_STRING.

5.2.9 El valor predeterminado es SORT_REGULAR.

5.2.8- El valor predeterminado es SORT_STRING

Funciona perfectamente . Espero que ayude a lo mismo.

Norman Edance
fuente
1
array_merge()aunque no conserva las claves. La matriz creada por eso tiene un índice 0.
HPierce
@HPierce bueno, en el caso de adición de matrices multidimensionales, parte de la información se perderá usando +. Eche un vistazo a: PHPFiddle , $ b [0] se perderá ...
Norman Edance
1

La nueva forma de hacerlo con php7.4 es Spread operator [...]

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

El operador de propagación debería tener un mejor rendimiento que array_merge

Una ventaja significativa del operador Spread es que admite cualquier objeto transitable, mientras que la función array_merge solo admite matrices.

Shoaib Ahmed
fuente