我在下面有以下数组,对联合运算符进行了实验。
$a = array(1,2,3,6);
$b = array(1, 2, 3, 4, 5);
$c = $b + $a;
$c 似乎是 1,2,3,4,5
因此,我假设数组 $b 是针对数组 $a 检查的。$b 中不存在 6,因此不会添加到其中。
现在,如果我将其切换为 $c = $a + $b,我只期望 (1,2,3,6)。
但是,实际输出为 (1,2,3,6,5)。
谁能解释一下?
用于+
追加数组,该过程是通过键而不是值来检查的。
与array_merge不同的是,当你使用 时+
,第二个数组中的值不会用相同的键覆盖第一个数组中的值。
所以对于$b + $a
,不会$b
覆盖任何值,所以结果仍然是array(1, 2, 3, 4, 5)
。
对于$a + $b
,1,2,3,6
将保留 ,并附加额外的值6
,因此结果将为array(1,2,3,6,5)
。
我认为您误解了+
operator 如何使用array
. 什么时候+
用于array
它基本上keys
不合并2个数组values
例如。我将解释为什么$c
结果与您预期的不同。
# $a = array(1,2,3,6);
$a = array(
0 => 1,
1 => 2,
2 => 3,
3 => 6
);
# $b = array(1, 2, 3, 4, 5);
$b = array(
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5
);
// the + operator simply do this
$c[0] = $a[0] + $b[0]; // yield 1
...
...
$c[3] = $a[3] + $b[3]; // yield 6
$c; // yield array(1,2,3,6,5)
取+
最左边的变量并首先使用它的所有值。如果它的所有值都用完了,但左边的条目数量少于右边的条目,它将用右边的条目填充其余部分。
$foo = array("foo");
$boo = array(true, "bar");
$foobar = $foo + $boo;
首先,$foobar
用 中的内容填充$foo
,但随后,由于 的长度$boo
大于$foo
,$foobar
因此由$boo
的值填充$foo
。所以第一个值被忽略,因为它已经被 使用过$foo
,但是第二个值还没有被合并。
这个概念也适用于定义数组的键时(即,$arr['location'] 而不是 $arr[])。右边的键不会覆盖左边的。
解释$c = $a + $b 的最简单方法。
$c首先获取(第一个操作数)$a的“键值对”。
如果(第二个操作数)$b的“键值对”多于$a ..
然后$c将多余的$b添加 到数组的末尾。
否则,$c仍然等同于$a。
$a =
0 => 2,
1 => 5,
2 => 8,
$b =
0 => 9,
1 => 2,
2 => 1,
3 => 5,
4 => 6,
$c =
0 => 2,
1 => 5,
2 => 8,
3 => 5, //From $b
4 => 6, //From $b