如何追加一个数组到另一个没有比较他们的键?
$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 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不可遍历,将会引发警告
根据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 !
在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不可遍历,将会引发警告
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有相同的键,它什么都不会做。