multidimensional - PHP agrega una matriz a otra(no array_push o+)
ejemplos de array_push en php (12)
¿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;
¿Por qué no usar
$appended = array_merge($a,$b);
¿Por qué no quieres usar esto, el método correcto e incorporado?
Antes de PHP7 puedes usar:
array_splice($a, count($a), 0, $b);
Es una publicación bastante antigua, pero quiero agregar algo sobre la adición de una matriz a otra:
Si
- una o ambas matrices tienen claves asociativas
- las claves de ambas matrices no importan
Puedes usar funciones de matriz como esta:
array_merge(array_values($array), array_values($appendArray));
array_merge no combina claves numéricas, por lo que agrega todos los valores de $ appendArray. Al usar funciones nativas de php en lugar de foreach-loop, debería ser más rápido en arreglos con muchos elementos.
Otra forma de hacer esto en PHP 5.6+ sería usar el token ...
$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 funcionará 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'');
Sin embargo, una advertencia , esto causará un error fatal si la matriz $b
está vacía
Para una matriz grande, 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
Qué tal esto:
$appended = $a + $b;
Si desea combinar una matriz vacía con un nuevo valor existente. Debes 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 su ayuda.
Siguiendo con las respuestas de 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);
Lo que produce:
Test 1: 0.008392
Test 2: 0.004626
Test 3: 0.003574
Creo que a partir de PHP 7, el método 3 es una alternativa significativamente mejor debido a la forma en que actúan los bucles foreach ahora , que es hacer una copia de la matriz que se está iterando.
Si bien el método 3 no es estrictamente una respuesta a los criterios 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 que ... la sintaxis fuera una opción.
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.
// 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
array_merge
es la forma elegante:
$a = array(''a'', ''b'');
$b = array(''c'', ''d'');
$merge = array_merge($a, $b);
// $merge is now equals to array(''a'',''b'',''c'',''d'');
Haciendo algo como:
$merge = $a + $b;
// $merge now equals array(''a'',''b'')
No funcionará, porque el operador +
realidad no los fusiona. Si $a
tiene las mismas claves que $b
, no hará nada.
$a = array("a", "b");
$b = array("c", "d");
$a = implode(",", $a);
$b = implode(",", $b);
$c = $a . "," . $b;
$c = explode(",", $c);
<?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
)