Combine dos matrices asociativas con claves numéricas y conserve las claves originales

4 minutos de lectura

Avatar de usuario de Awan
Awan

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 estas dos matrices de modo que no contengan duplicados y que mantengan 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?

Avatar de usuario de KingCrunch
reycrunch

Solo usa:

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

Eso debería solucionarlo. Debido a que usa claves de cadena si una clave aparece más de una vez (como '44' en su ejemplo) una tecla sobrescribirá las anteriores 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 teclas de cadena numéricas como números (enteros) y, por lo tanto, se comportará así, lo que significa que también vuelve a numerar las teclas …

Una solución consiste en volver a crear las claves.

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

Actualización 2: Siempre se me olvida, que también hay un operador (en negrita, porque este es en realidad ¡Qué estás buscando! :D)

$output = $array1 + $array2;

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

  • @KingCrunch: aunque se citan los números, esos son no claves de cadena y por lo que el índice no ser preservado. Ejemplo: ideone.com/I2NFT

    –Brendan Bullen

    30 de junio de 2011 a las 13:29


  • De verdad… 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

    30 de junio de 2011 a las 13:32

  • Entonces $array1 + $array2 es una solución corta y eficiente en lugar de array_merge() - array_combine() combinación

    – Awan

    30 de junio de 2011 a las 13:54


  • Obviamente lo es. Nunca me di cuenta del comportamiento de array_merge() con teclas de cadena numéricas antes y primero que esperaba + y array_merge() se comportan casi idénticos, pero parece que he aprendido algo 🙂

    – KingCrunch

    30 de junio de 2011 a las 14:01

  • ¡ADVERTENCIA! para arreglos no asociados o si los arreglos tienen claves comunes $a + $b != array_merge($a, $b)

    – jmarceli

    8 mayo 2018 a las 15:21

Debes tomar en consideración 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 $matriz2 + $matriz1

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

Avatar de usuario de Michas
michas

Esto funciona:

$output = $array1 + $array2;

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

    – jchook

    14/10/2016 a las 23:56

  • @jchook ¿Qué recomiendas entonces?

    – Michas

    15 de octubre de 2016 a las 0:03

  • Esto es lo que necesitaba, gracias. Este es el por qué: http_build_query(array_merge($array1, $array2)) no funcionó para mí, mientras que http_build_query($array1 + $array2) hizo.

    – Barry

    6 de febrero de 2017 a las 16:20

La nueva forma de hacerlo con php7.4 es operador de propagación […]

$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.

Avatar de usuario de Brendan Bullen
Brendan Bullen

Para hacer esto, puede recorrer uno y agregarlo 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));

?>

ACTUALIZAR: KingCrunch ideó la mejor solución: print_r($array1+$array2);

avatar de usuario de elitalon
elitalón

Esto funciona:

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

Avatar de usuario de la comunidad
Comunidad

¡Advertencia! $matriz1 + $matriz2 sobrescribe las claves, por lo que mi solución (para matrices multidimensionales) es usar arreglo_único()

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

Aviso:

5.2.10+ Cambió el valor predeterminado de sort_flags volver a SORT_STRING.

5.2.9 El valor predeterminado es SORT_REGULAR.

5.2.8- El valor predeterminado es SORT_STRING.

Él funciona perfectamente. Espero que ayude igual.

  • array_merge() aunque no conserva las claves. La matriz creada por eso es 0 indexada.

    – HPierce

    21 de noviembre de 2017 a las 12:20

  • @HPierce bien, en el caso de adición de matriz multidimensional, se perderá parte de la información usando +. Echa un vistazo a: PHPFiddle $b[0] se perderá…

    – Norman Edanza

    22 de noviembre de 2017 a las 6:00


¿Ha sido útil esta solución?