如何追加一个数组到另一个没有比较他们的键?

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

最后应该是:阵列([0]= > [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;

当前回答

在PHP7之前,你可以使用:

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

Array_splice()操作引用数组(第一个参数),并将数组(第四个参数)的值放置在从第二个参数和第三个参数开始的值列表中。当我们将第2个参数设置为源数组的结束,第3个参数设置为零时,我们将第4个参数值附加到第1个参数

其他回答

如果您想合并空数组与现有的新值。您必须先初始化它。

$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

希望能有所帮助。

根据bstoney和Snark的回答,我对各种方法进行了一些测试:

// Test 1 (array_merge)
$array1 = $array2 = array_fill(0, 50000, 'aa');
$start = microtime(true);
$array1 = array_merge($array1, $array2);
printf("Test 1: %.06f\n", microtime(true) - $start);

// Test2 (foreach)
$array1 = $array2 = array_fill(0, 50000, 'aa');
$start = microtime(true);
foreach ($array2 as $v) {
    $array1[] = $v;
}
printf("Test 2: %.06f\n", microtime(true) - $start);

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

生产:

Test 1: 0.002717 
Test 2: 0.006922 
Test 3: 0.004744

ORIGINAL:我相信在PHP 7中,方法3是一个明显更好的选择,因为foreach循环现在的行为方式,即创建一个迭代数组的副本。

虽然方法3并不是严格地回答问题中的'not array_push'的标准,但它是一行并且在各方面都是最高性能的,我认为这个问题在…语法是一个选项。

更新25/03/2020: 我已经更新了有缺陷的测试,因为变量没有重置。有趣的(或令人困惑的)结果现在显示测试1是最快的,而它是最慢的,从0.008392到0.002717!这只能归结于PHP更新,因为这不会受到测试缺陷的影响。

所以,传奇继续,我将从现在开始使用array_merge !

在PHP7之前,你可以使用:

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

Array_splice()操作引用数组(第一个参数),并将数组(第四个参数)的值放置在从第二个参数和第三个参数开始的值列表中。当我们将第2个参数设置为源数组的结束,第3个参数设置为零时,我们将第4个参数值附加到第1个参数

为什么不使用

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

你为什么不想用这个,正确的内置方法。

这是一篇相当老的文章,但我想添加一些关于将一个数组附加到另一个数组的东西:

If

一个或两个数组都有关联键 两个数组的键都不重要

你可以像这样使用数组函数:

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

array_merge不合并数字键,所以它附加$appendArray的所有值。当使用原生php函数而不是foreach-loop时,它应该在包含大量元素的数组上更快。

除了2019-12-13: 从PHP 7.4开始,就有可能以数组展开操作符的方式追加或前置数组:

    $a = [3, 4];
    $b = [1, 2, ...$a];

和以前一样,这个新功能的键可能是一个问题:

    $a = ['a' => 3, 'b' => 4];
    $b = ['c' => 1, 'a' => 2, ...$a];

"致命错误:未捕获错误:无法解包包含字符串键的数组"

    $a = [3 => 3, 4 => 4];
    $b = [1 => 1, 4 => 2, ...$a];

阵列(4){ [1] = > int (1) [4] = > int (2) [5] = > int (3) [6] = > int (4) }

    $a = [1 => 1, 2 => 2];
    $b = [...$a, 3 => 3, 1 => 4];

数组(3){ [0] = > int (1) [1] = > int (4) [3] = > int (3) }