PHP добавляет один массив в другой (а не array_push или +)

Как добавить один массив в другой, не сравнивая их ключи?

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

В конце это должно быть: Array( [0]=>a [1]=>b [2]=>c [3]=>d ) Если я использую что-то вроде [] или array_push , это приведет к одному из этих Результаты:

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

Это просто должно быть что-то, делая это, но более элегантным способом:

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

array_merge – это элегантный способ:

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

Выполнение чего-то вроде:

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

Не будет работать, потому что оператор + фактически не объединяет их. Если они $a имеют те же ключи, что и $b , это ничего не сделает.

Почему бы не использовать

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

Почему бы вам не использовать этот, правильный, встроенный метод.

 <?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)); ?> 

Вывод:

 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 ) 

Исходный код ссылки

Это довольно старый пост, но я хочу добавить что-то о добавлении одного массива в другой:

Если

  • один или оба массива имеют ассоциативные ключи
  • ключи обоих массивов не имеют значения

вы можете использовать такие функции массива, как:

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

array_merge не объединяет числовые ключи, поэтому он добавляет все значения $ appendArray. При использовании собственных функций php вместо цикла foreach он должен быть быстрее на массивах с большим количеством элементов.

Другой способ сделать это в PHP 5.6+ – использовать токен

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

Это также будет работать с любым 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'); 

Предупреждение, однако, это приведет к фатальной ошибке, если массив $b пуст

После ответа от bstoney и Snark я сделал несколько тестов по различным методам:

 $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); 

Что производит:

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

Я полагаю, что с PHP 7, метод 3 является значительно лучшей альтернативой из-за того, что теперь действуют петли foreach , которые должны сделать копию массива, которая повторяется.

Хотя метод 3 не является строго ответом на критерии «not array_push» в вопросе, это одна строка и самая высокая производительность во всех отношениях, я думаю, вопрос был задан до того, как синтаксис был вариантом.

Для большого массива лучше конкатенировать без array_merge, чтобы избежать копирования памяти.

 $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 

foreach loop быстрее, чем array_merge, чтобы добавлять значения в существующий массив, поэтому вместо этого выберите цикл, если вы хотите добавить массив в конец другого.

 // 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 

если вы хотите объединить пустой массив с существующим новым значением. Вы должны сначала инициализировать его.

 $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 

Надеюсь, его помощь.

Перед PHP7 вы можете использовать:

 array_splice($a, count($a), 0, $b); 
 $a = array("a", "b"); $b = array("c", "d"); $a = implode(",", $a); $b = implode(",", $b); $c = $a . "," . $b; $c = explode(",", $c); 

Как насчет этого:

 $appended = $a + $b;