2010-05-11 267 views
33

有人可以帮我解释一下吗?我有两个代码片段,其中一个按我期望的方式工作,但另一个没有。PHP:一起添加阵列

这工作

$a = array('a' => 1, 'b' => 2); 
$b = array('c' => 3); 
$c = $a + $b; 
print_r($c); 

// Output 
Array 
(
    [a] => 1 
    [b] => 2 
    [c] => 3 
) 

这不

$a = array('a', 'b'); 
$b = array('c'); 
$c = $a + $b; 
print_r($c); 

// Output 
Array 
(
    [0] => a 
    [1] => b 
) 

这到底是怎么回事?为什么第二个版本不会将这两个数组加在一起?我误解了什么?我应该做些什么呢?或者它是PHP中的错误?

+2

** [+运算符为PHP中的数组可能重复?](http://stackoverflow.com/questions/2140090/operator-for-array-in-php)** – Gordon 2010-05-11 15:07:19

+0

你的例子是错误的。第二个输出应该是'1 =>'a',2 =>'b''。 – Tgr 2010-05-11 15:09:27

+0

@戈登:不,我有点知道+操作符的意思,只是......误解了一点:p – Svish 2010-05-11 15:12:13

回答

22

这是记载和正确的:http://us3.php.net/manual/en/language.operators.array.php

+运算追加其余按键的元素从右手阵列左手,而重复的键不会被覆盖。

所以我想这不是在PHP中的错误,并假设发生了什么。我还没有注意到这一点。

+0

你可以说这是一个设计缺陷。当一些键是数字时(这对于表示数据库记录的数组来说很常见),两个关联数组会导致奇怪的结果。 – Tgr 2010-05-11 15:13:44

+1

实际上,如果您需要合并两个数组并保留数字键(或者将数字键显着的数组合并在一起),那么它的设计就非常有用。正如其他人所说,你应该使用array_merge()。 – 2013-04-16 06:33:50

20

要添加两个非关联数组你需要使用array_merge功能:

使得 一个的值被附加到 的端部的一个或多个 数组的元素用于合并在一起前一个。它返回结果 数组。

如果输入数组具有相同的 字符串键,然后 后来值键会覆盖原有的 之一。但是,如果数组中包含 数字键,则后面的值不会覆盖原始值,但会附加 。

如果只给出一个数组并且 数组被索引,则键 会以连续方式重新编制索引。

18

要短,这样做是因为,如果你的print_r $ a与$ B你:

Array 
(
    [a] => 1 
    [b] => 2 
) 

Array 
(
    [c] => 3 
) 

你可以看到所有元素都有不同的键...

作为第二个例子阵列,如果您打印$ a和$ b你有:

Array 
(
    [0] => a 
    [1] => b 
) 

Array 
(
    [0] => c 
) 

和0键都 'a' 和 'C'在此问题上,以相同的密钥第二数组的元素被丢弃......如果你这样做:

$c = $b + $a; // instead of $c = $a + $b; 

结果将是:

Array 
(
    [0] => c 
    [1] => b 
) 
+1

不错的视觉解释发生了什么。 – beporter 2013-10-18 14:00:18

+0

IMO,这应该是被接受的答案。 – Tyzoid 2014-01-03 19:18:57

1

在处理数组时,plus运算符不会覆盖索引,也不会重新索引数组。在你的例子中,c的索引0与a一样,所以它被丢弃。使用array_merge。

0
array_splice($a,count($a),0,$b); //array $a becomes a group of $a and $b arrays. 

P.S.它适用于索引数组(不是关联)