下面我有以下数组,对union运算符进行实验。
$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中不存在,因此它不会添加到它。
现在,如果我要切换到 $ c = $ a + $ b,我只期望(1,2,3,6)。
但实际输出为(1,2,3,6,5)。
任何人都能解释一下吗?
答案 0 :(得分:2)
使用+
追加数组,按键检查过程,而不是值。
与array_merge不同,当您使用+
时,第二个数组中的值不会覆盖第一个数组中具有相同键的值。
因此对于$b + $a
,$b
中的值不会被覆盖,因此结果仍为array(1, 2, 3, 4, 5)
。
对于$a + $b
,1,2,3,6
将被保留,并追加额外值6
,因此结果将为array(1,2,3,6,5)
。
答案 1 :(得分:1)
+
获取最左边的变量并首先使用其所有值。如果它的所有值都用完了,但是左边的条目数量少于右边的条目数量,那么它会用正确的值填充其余的值。
$foo = array("foo");
$boo = array(true, "bar");
$foobar = $foo + $boo;
首先,$foobar
填充了$foo
中的内容,但是,由于$boo
的长度大于$foo
,因此填充了$foobar
$boo
的{{1}}值所在的值$foo
。因此,第一个值被忽略,因为它已被$foo
使用,但第二个值尚未被合并。
这个概念也适用于定义数组的键(即$ arr ['location']而不是$ arr [])。右边的键不会覆盖左边的。
答案 2 :(得分:1)
我认为您误解了+
运算符与array
的对应关系。
当+
用于array
时,它基本上按keys
而不是values
合并2个数组
例如。我会解释为什么$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)
答案 3 :(得分:0)
最简单的方法来解释 $ c = $ a + $ b 。
$ c 首先获取(第一个操作数) $ a 的"键值对" 。
如果(第二个操作数) $ b 有更多&#34;键值对&#34; 而不是 $ a .. < / p>
$ 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