PHP append one array to another (not array_push or +)
如何在不比较键的情况下将一个数组附加到另一个数组?
最后应该是:
它应该是一些东西,这样做,但以一种更优雅的方式:
1 2 | foreach ( $b AS $var ) $a[] = $var; |
1 2 3 4 | $a = array('a', 'b'); $b = array('c', 'd'); $merge = array_merge($a, $b); // $merge is now equals to array('a','b','c','d'); |
做一些类似的事情:
1 2 | $merge = $a + $b; // $merge now equals array('a','b') |
不会工作,因为
在php 5.6+中实现这一点的另一种方法是使用
1 2 3 4 5 6 | $a = array('a', 'b'); $b = array('c', 'd'); array_push($a, ...$b); // $a is now equals to array('a','b','c','d'); |
这也适用于任何
1 2 3 4 5 6 | $a = array('a', 'b'); $b = new ArrayIterator(array('c', 'd')); array_push($a, ...$b); // $a is now equals to array('a','b','c','d'); |
但是,如果数组
为什么不使用
1 |
为什么不使用这个,正确的,内置的方法呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?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" Example 1 Output:"; 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" Example 2 Output:"; 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" Example 3 Output:"; 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" Example 4 Output:"; print_r(array_merge($array7)); ?> |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
参考源代码
这是一篇相当古老的文章,但我想添加一些关于将一个数组附加到另一个数组的内容:
如果
- 一个或两个数组都有关联键
- 两个数组的键都不重要
您可以使用这样的数组函数:
1 |
数组合并不会合并数字键,因此它会附加$AppendArray的所有值。当使用本机PHP函数而不是foreach循环时,在包含大量元素的数组上应该更快。
在Bstoney和Snark的回答之后,我对各种方法做了一些测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $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 ", microtime(true) - $start); // Test2 (foreach) $start = microtime(true); foreach ($array2 as $v) { $array1[] = $v; } echo sprintf("Test 2: %.06f ", 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 ", microtime(true) - $start); |
产生:
1 2 3 | Test 1: 0.008392 Test 2: 0.004626 Test 3: 0.003574 |
我相信从PHP7开始,方法3是一个更好的选择,因为foreach循环现在的行为方式是复制一个被迭代的数组。
虽然方法3并不能严格地回答问题中"非数组推"的标准,但它是一条线,在所有方面都是最高性能的,我认为这个问题是在……语法是一种选择。
对于大数组,最好在不合并数组的情况下进行连接,以避免内存复制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $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 ", microtime(true) - $start); // Test2 (avoid copy) $start = microtime(true); foreach ($array2 as $v) { $array1[] = $v; } echo sprintf("Test 2: %.06f ", microtime(true) - $start); // Test 1: 0.004963 // Test 2: 0.000038 |
foreach循环比数组合并更快地将值附加到现有数组,因此如果要将数组添加到另一个数组的末尾,请选择循环。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // 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 |
在PHP7之前,您可以使用:
1 |
如果要将空数组与现有的新值合并。必须先初始化它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $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 |
希望有帮助。
这个怎么样?
1 | $appended = $a + $b; |