php将一个数组附加到另一个数组(不是array_push或+)

PHP append one array to another (not array_push or +)

如何在不比较键的情况下将一个数组附加到另一个数组?

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

最后应该是:Array( [0]=>a [1]=>b [2]=>c [3]=>d )。如果我使用类似于[]array_push的东西,它将导致以下结果之一:

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

它应该是一些东西,这样做,但以一种更优雅的方式:

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


array_merge是一种优雅的方式:

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

不会工作,因为+运算符实际上没有合并它们。如果他们的$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');

这也适用于任何Traversable

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

但是,如果数组$b为空,则会导致致命错误。


为什么不使用

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

为什么不使用这个,正确的,内置的方法呢?


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

参考源代码


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

如果

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

您可以使用这样的数组函数:

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

数组合并不会合并数字键,因此它会附加$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
array_splice($a, count($a), 0, $b);

array_splice()引用数组(第一个参数)进行操作,并将数组(第四个参数)值替换为从第二个参数和第三个参数的数目开始的值列表。当我们将第二个参数设置为源数组的结尾,将第三个参数设置为零时,我们将第四个参数值附加到第一个参数


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

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;