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?
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 dearray_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+
yarray_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'
);
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 quehttp_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.
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);
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);
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