¿Cómo agregar una matriz a otra sin comparar sus claves?
$a = array( 'a', 'b' );
$b = array( 'c', 'd' );
Al final debería ser: Array( [0]=>a [1]=>b [2]=>c [3]=>d )
si uso algo como []
o array_push
, causará uno de estos resultados:
Array( [0]=>a [1]=>b [2]=>Array( [0]=>c [1]=>d ) )
//or
Array( [0]=>c [1]=>d )
Simplemente debería ser algo, hacer esto, pero de una manera más elegante:
foreach ( $b AS $var )
$a[] = $var;
array_merge ($a, $b)
debe hacer exactamente lo que quiere, al menos con PHP 5+.array_merge();
la salida dearray_merge();
debe ser exactamente lo que necesita:print_r(array_merge($a,$b)); // outputs => Array ( [0] => a [1] => b [2] => c [3] => d )
Respuestas:
array_merge
es la forma elegante:Haciendo algo como:
No funcionará, porque el
+
operador no los fusiona realmente. Si$a
tienen las mismas claves que$b
, no hará nada.fuente
Otra forma de hacer esto en PHP 5.6+ sería usar el
...
tokenEsto también funcionará con cualquier
Traversable
Sin embargo, una advertencia :
$b
es una matriz vacía o no es transitable, por ejemplo, no es una matriz$b
no es transitablefuente
...
comúnmente conocido comosplat operator
en php.array_push
acepta un único argumento desde php 7.3, que evita errores con matrices vacías.¿Por qué no usar
¿Por qué no quieres usar este, el método correcto incorporado?
fuente
PHP append one array to another (not array_merge or array_push)
... posteriormente modificadaPHP append one array to another (not array_merge or +)
antes de cambiar a su título actualEs una publicación bastante antigua, pero quiero agregar algo sobre agregar una matriz a otra:
Si
puedes usar funciones de matriz como esta:
array_merge no combina claves numéricas, por lo que agrega todos los valores de $ appendArray. Si bien utiliza funciones php nativas en lugar de un bucle foreach, debería ser más rápido en matrices con muchos elementos.
Adición 2019-12-13: desde PHP 7.4, existe la posibilidad de agregar o anteponer matrices de la manera del Operador de distribución de matriz:
Como antes, las claves pueden ser un problema con esta nueva característica:
"Error grave: error no detectado: no se puede descomprimir la matriz con claves de cadena"
array (4) {[1] => int (1) [4] => int (2) [5] => int (3) [6] => int (4)}
array (3) {[0] => int (1) [1] => int (4) [3] => int (3)}
fuente
Salida:
Código fuente de referencia
fuente
Para una matriz grande, es mejor concatenar sin array_merge, para evitar una copia de memoria.
fuente
Siguiendo las respuestas de bstoney y Snark, realicé algunas pruebas sobre los distintos métodos:
Que produce:
ORIGINAL: Creo que a partir de PHP 7, el método 3 es una alternativa significativamente mejor debido a la forma en que ahora actúan los bucles foreach , que es hacer una copia de la matriz que se repite.
Si bien el método 3 no es estrictamente una respuesta a los criterios de 'not array_push' en la pregunta, es una línea y el rendimiento más alto en todos los aspectos, creo que la pregunta se hizo antes de ... la sintaxis era una opción.
ACTUALIZACIÓN 25/03/2020: He actualizado la prueba que fue defectuosa ya que las variables no se restablecieron. ¡Curiosamente (o confusamente) los resultados ahora muestran que la prueba 1 es la más rápida, donde fue la más lenta, habiendo pasado de 0.008392 a 0.002717! Esto solo puede deberse a actualizaciones de PHP, ya que esto no se habría visto afectado por la falla de prueba.
Entonces, la saga continúa, ¡comenzaré a usar array_merge a partir de ahora!
fuente
A partir de PHP 7.4 se puede utilizar el ... operador . Esto también se conoce como el operador splat en otros idiomas, incluido Ruby.
Salida
El operador Splat debería tener un mejor rendimiento que array_merge . Esto no solo se debe a que el operador splat es una estructura de lenguaje, mientras que array_merge es una función, sino también a que la optimización del tiempo de compilación puede ser eficaz para matrices constantes.
Además, podemos usar la sintaxis del operador splat en cualquier lugar de la matriz, ya que se pueden agregar elementos normales antes o después del operador splat.
fuente
Antes de PHP7 puedes usar:
array_splice()
opera con referencia a la matriz (1er argumento) y coloca los valores de la matriz (4to argumento) en lugar de la lista de valores comenzados desde el 2do argumento y el número del 3er argumento. Cuando establecemos el segundo argumento como final de la matriz fuente y el tercero como cero, agregamos los valores del cuarto argumento al primer argumentofuente
si desea fusionar una matriz vacía con un nuevo valor existente. Debes inicializarlo primero.
Espero que sea de ayuda.
fuente
foreach loop es más rápido que array_merge para agregar valores a una matriz existente, así que elija el bucle en su lugar si desea agregar una matriz al final de otra.
fuente
Qué tal esto:
fuente
'0' => 'a'
... en lugar de0 => 'a'
?array + array