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

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

当前回答

从PHP 7.4开始,你可以使用…操作符。这在其他语言(包括Ruby)中也称为splat操作符。

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

输出

array(5) {
    [0]=>
    string(6) "banana"
    [1]=>
    string(6) "orange"
    [2]=>
    string(5) "apple"
    [3]=>
    string(4) "pear"
    [4]=>
    string(10) "watermelon"
}

Splat操作符应该比array_merge有更好的性能。这不仅是因为splat操作符是一种语言结构,而array_merge是一个函数,而且还因为编译时优化可以用于常量数组。

此外,我们可以在数组中的任何地方使用splat操作符语法,因为普通元素可以添加在splat操作符之前或之后。

$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];
$arr3 = [...$arr1, ...$arr2];
$arr4 = [...$arr1, ...$arr3, 7, 8, 9];

其他回答

在PHP7之前,你可以使用:

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

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

在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');

这也适用于任何可穿越的

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

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

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

警告:

在7.3之前的PHP版本中,如果$b是空数组或不可遍历(例如不是数组),这将导致致命错误 在PHP 7.3中,如果$b不可遍历,将会引发警告

为什么不使用

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

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

Foreach循环在向现有数组追加值方面比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

对于大数组,最好不使用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