2010-11-24 17 views
171

¿Cómo agregar una matriz a otra sin comparar sus claves?PHP anexar una matriz a otra (no array_push o +)

$a = array('a', 'b'); 
$b = array('c', 'd'); 

Al final que debe ser: Array([0]=>a [1]=>b [2]=>c [3]=>d) Si utilizo algo como [] o array_push, que hará que uno de estos resultados:

Array([0]=>a [1]=>b [2]=>Array([0]=>c [1]=>d)) 
//or 
Array([0]=>c [1]=>d) 

Sólo debe ser algo, haciendo esto, pero de una manera más elegante:

foreach ($b AS $var) 
    $a[] = $var; 
+10

'array_merge ($ a, $ b)' debe hacer exactamente lo que usted desea, al menos con PHP 5+. – tloach

+1

* (relacionado) * [+ Operador de matriz en PHP] (http://stackoverflow.com/questions/2140090/operator-for-array-in-php/2140094#2140094) – Gordon

+4

ninguno de los resultados publicados proviene de 'array_merge();' el resultado de 'array_merge();' debería ser exactamente lo que necesita: 'print_r (array_merge ($ a, $ b)); // outputs => Array ([0] => a [1] => b [2] => c [3] => d) ' – acm

Respuesta

272

array_merge es la manera elegante:

$a = array('a', 'b'); 
$b = array('c', 'd'); 
$merge = array_merge($a, $b); 
// $merge is now equals to array('a','b','c','d'); 

Hacer algo como:

$merge = $a + $b; 
// $merge now equals array('a','b') 

no va a funcionar, porque el operador + en realidad no combinarlos. Si ellos $a tiene las mismas claves que $b, no hará nada.

+6

Solo tenga cuidado si sus claves no son números sino cadenas, del documento: si las matrices de entrada tienen las mismas claves de cadena, el valor posterior de esa tecla sobrescribirá la anterior uno –

-4

¿Qué tal esto:

$appended = $a + $b; 
+1

Comparará claves, como dije, y resultará con lo siguiente: Matriz ([0] => a [1] => b) –

+0

¿Está * seguro * que comparará las claves? Dice la documentación (énfasis mío): "Si las matrices de entrada tienen las mismas claves de cadena, el último valor de esa tecla sobrescribirá la anterior. ** Sin embargo, si las matrices contienen claves numéricas, el valor posterior no se sobrescribirá. el valor original, pero se adjuntará. ** ". ¿Estás seguro de que tus claves no son en realidad ''0 '=>' a'' ... en lugar de' 0 => 'a''? – Piskvor

+1

Acabo de probarlo. –

23

Por qué no usar

$appended = array_merge($a,$b); 

¿Por qué no quieres usar esto, el método correcto, incorporado.

+1

Bien, lo siento mucho por los malentendidos. Funciona exactamente de esta manera, gracias! –

+0

¿Dónde dice OP que "no quiere usar" array_merge() ...? – KittenCodings

+0

@KittenCodings - Lea el "historial de edición" de la pregunta ... la pregunta original se tituló 'PHP anexar una matriz a otra (no array_merge o array_push)' ... posteriormente modificada a 'PHP anexar una matriz a otra (no array_merge o +) 'antes de cambiar a su título actual –

-3
$a = array("a", "b"); 
$b = array("c", "d"); 

$a = implode(",", $a); 
$b = implode(",", $b); 

$c = $a . "," . $b; 
$c = explode(",", $c); 
+4

Overhead. Tampoco funcionará si tiene 'array (" a, b "," b, c ")' – milkovsky

+0

también, sin explicación, incluso si esta fue la mejor manera de hacerlo – ThisGuyHasTwoThumbs

15
<?php 
// Example 1 [Merging associative arrays. When two or more arrays have same key 
// then the last array key value overrides the others one] 

$array1 = array("a" => "JAVA", "b" => "ASP"); 
$array2 = array("c" => "C", "b" => "PHP"); 
echo " <br> Example 1 Output: <br>"; 
print_r(array_merge($array1,$array2)); 

// Example 2 [When you want to merge arrays having integer keys and 
//want to reset integer keys to start from 0 then use array_merge() function] 

$array3 =array(5 => "CSS",6 => "CSS3"); 
$array4 =array(8 => "JAVASCRIPT",9 => "HTML"); 
echo " <br> Example 2 Output: <br>"; 
print_r(array_merge($array3,$array4)); 

// Example 3 [When you want to merge arrays having integer keys and 
// want to retain integer keys as it is then use PLUS (+) operator to merge arrays] 

$array5 =array(5 => "CSS",6 => "CSS3"); 
$array6 =array(8 => "JAVASCRIPT",9 => "HTML"); 
echo " <br> Example 3 Output: <br>"; 
print_r($array5+$array6); 

// Example 4 [When single array pass to array_merge having integer keys 
// then the array return by array_merge have integer keys starting from 0] 

$array7 =array(3 => "CSS",4 => "CSS3"); 
echo " <br> Example 4 Output: <br>"; 
print_r(array_merge($array7)); 
?> 

Salida:

Example 1 Output: 
Array 
(
[a] => JAVA 
[b] => PHP 
[c] => C 
) 

Example 2 Output: 
Array 
(
[0] => CSS 
[1] => CSS3 
[2] => JAVASCRIPT 
[3] => HTML 
) 

Example 3 Output: 
Array 
(
[5] => CSS 
[6] => CSS3 
[8] => JAVASCRIPT 
[9] => HTML 
) 

Example 4 Output: 
Array 
(
[0] => CSS 
[1] => CSS3 
) 

Reference Source Code

13

Es un post bastante viejo, pero quiero añadir algo acerca de anexar una matriz a otra:

Si

  • una o ambas matrices asociativas tienen teclas
  • las claves de ambas tablas no importan

puede utilizar un arreglo de funciones como esto:

array_merge(array_values($array), array_values($appendArray)); 

array_merge doesn Combina las teclas numéricas para que añada todos los valores de $ appendArray. Al usar funciones nativas de php en lugar de un foreach-loop, debería ser más rápido en arreglos con muchos elementos.

+1

Este es el método que suelo usar, es algo que generalmente escribo en un ayudante llamado array_merge_values ​​() –

+1

Esto también debería tener la ventaja de dejar las matrices de entrada intactas. –

+1

Sí, es más seguro por si acaso extraer los valores de la matriz para que no se combinen en las mismas claves. –

15

Otra forma de hacerlo en PHP 5.6+ sería utilizar el token de ...

$a = array('a', 'b'); 
$b = array('c', 'd'); 

array_push($a, ...$b); 

// $a is now equals to array('a','b','c','d'); 

Esto también funciona con cualquier Traversable

$a = array('a', 'b'); 
$b = new ArrayIterator(array('c', 'd')); 

array_push($a, ...$b); 

// $a is now equals to array('a','b','c','d'); 

Una advertencia sin embargo, esto causará un error fatal si el array está vacío $b

5

Para gran matriz, es mejor concatenar sin array_merge, para evitar una copia de memoria.

$array1 = array_fill(0,50000,'aa'); 
$array2 = array_fill(0,100,'bb'); 

// Test 1 (array_merge) 
$start = microtime(true); 
$r1 = array_merge($array1, $array2); 
echo sprintf("Test 1: %.06f\n", microtime(true) - $start); 

// Test2 (avoid copy) 
$start = microtime(true); 
foreach ($array2 as $v) { 
    $array1[] = $v; 
} 
echo sprintf("Test 2: %.06f\n", microtime(true) - $start); 


// Test 1: 0.004963 
// Test 2: 0.000038 
+0

Funciona como un encanto, para mí este enfoque fue 50 veces más rápido. – luttkens

6

A raíz de la respuesta de por bstoney y Snark Hice algunas pruebas sobre los diversos métodos:

$array1 = array_fill(0,50000,'aa'); 
$array2 = array_fill(0,50000,'bb'); 

// Test 1 (array_merge) 
$start = microtime(true); 
$array1 = array_merge($array1, $array2); 
echo sprintf("Test 1: %.06f\n", microtime(true) - $start); 

// Test2 (foreach) 
$start = microtime(true); 
foreach ($array2 as $v) { 
    $array1[] = $v; 
} 
echo sprintf("Test 2: %.06f\n", microtime(true) - $start); 

// Test 3 (... token) 
// PHP 5.6+ and produces error if $array2 is empty 
$start = microtime(true); 
array_push($array1, ...$array2); 
echo sprintf("Test 3: %.06f\n", microtime(true) - $start); 

que produce:

Test 1: 0.008392 
Test 2: 0.004626 
Test 3: 0.003574 

creo que a partir de PHP 7, Método 3 es una alternativa significativamente mejor debido a la forma foreach loops now act, que consiste en hacer una copia de la matriz que se itera.

Si bien el método 3 no es estrictamente una respuesta al criterio de 'no 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 ... sintaxis era una opción.

0

si desea fusionar una matriz vacía con un nuevo valor existente. Debe inicializarlo primero.

$products = array(); 
//just example 
for($brand_id=1;$brand_id<=3;$brand_id++){ 
    array_merge($products,getByBrand($brand_id)); 
} 
// it will create empty array 
print_r($a); 

//check if array of products is empty 
for($brand_id=1;$brand_id<=3;$brand_id++){ 
    if(empty($products)){ 
    $products = getByBrand($brand_id); 
    }else{ 
    array_merge($products,getByBrand($brand_id)); 
    } 
} 
// it will create array of products 

Espero que su ayuda.

0

Antes PHP7 que puede utilizar:

array_splice($a, count($a), 0, $b); 
1

bucle foreach es más rápido que array_merge para añadir valores a una matriz existente, así que elige el lazo en su lugar si desea agregar una matriz para el final de otro.

// Create an array of arrays 
$chars = []; 
for ($i = 0; $i < 15000; $i++) { 
    $chars[] = array_fill(0, 10, 'a'); 
} 

// test array_merge 
$new = []; 
$start = microtime(TRUE); 
foreach ($chars as $splitArray) { 
    $new = array_merge($new, $splitArray); 
} 
echo microtime(true) - $start; // => 14.61776 sec 

// test foreach 
$new = []; 
$start = microtime(TRUE); 
foreach ($chars as $splitArray) { 
    foreach ($splitArray as $value) { 
     $new[] = $value; 
    } 
} 
echo microtime(true) - $start; // => 0.00900101 sec 
// ==> 1600 times faster 
Cuestiones relacionadas