+ operator for array in PHP?
对于PHP中的数组,+意味着什么?
- 我注意到你的问题有+=,接受的答案有+。从我的测试来看,他们的行为似乎是一样的。
- 文档总结得很好
- 可能重复的引用-这个符号在PHP中是什么意思?
- @Robbieaverill——这是那个参考问题所指的问题。所以如果有什么问题是重复的
- 是否还有人对必须通过array_merge进行数组连接这样一个基本的操作感到有点害怕?这就好像数组在默认情况下是关联数组,数字数组是二级公民。
- (文档的第一条注释)[ph p.net/manual/en/language.operators.array.ph‌&8203;p 86379]和这些答案一样好。
从PHP语言操作手册中引用
The + operator returns the right-hand array appended to the left-hand array; for keys that exist in both arrays, the elements from the left-hand array will be used, and the matching elements from the right-hand array will be ignored.
所以如果你这样做
1 2 3 4
| $array1 = ['one', 'two', 'foo' => 'bar'];
$array2 = ['three', 'four', 'five', 'foo' => 'baz'];
print_r($array1 + $array2); |
你会得到
1 2 3 4 5 6 7
| Array
(
[0] => one // preserved from $array1 (left-hand array)
[1] => two // preserved from $array1 (left-hand array)
[foo ] => bar // preserved from $array1 (left-hand array)
[2] => five // added from $array2 (right-hand array)
) |
因此,+的逻辑相当于以下代码片段:
1 2 3 4 5 6 7
| $union = $array1;
foreach ($array2 as $key => $value) {
if (false === array_key_exists($key, $union)) {
$union[$key] = $value;
}
} |
如果您对C级实现的细节感兴趣,请访问
- php-src/zend/zend_operators.c
注意,+与array_merge()组合阵列的方式不同:
会给你
1 2 3 4 5 6 7 8 9
| Array
(
[0] => one // preserved from $array1
[1] => two // preserved from $array1
[foo ] => baz // overwritten from $array2
[2] => three // appended from $array2
[3] => four // appended from $array2
[4] => five // appended from $array2
) |
有关更多示例,请参见链接页。
- +运行后的密钥顺序是否得到规范的保证?
- @php.net生成的pacerier php没有正式的规范,但是+和array_merge都在引擎盖下调用zend_hash_merge。这也是意料之中的,因为在PHP中,数组是作为有序散列映射实现的。
- @bishop,php.net上的手册不是针对php的规范吗?
- @pacerier php.net在线文档是最接近规范的记录,但在我看来,这些文档远远没有真正的规范:一,它们是在代码编写之后更新的;二,它们不是为覆盖每一种特殊用途而编写的。
- @主教,已经有20多年的历史了,难道那时没有人提出一个真正的规范建议吗?
- @pacerier hhvm.com/blog/5723/announcing-a-specification-for-php
- @Pacerier澄清了Gordon的链接,该规范适用于hhvm。虽然hhvm"故意重新创建php.net错误和奇怪之处",但不应将其视为php.net发布的php的正式规范。
- @Pacerier Stas已经完成了PHP5.6的工作草案规范,但似乎没有解决这个问题。我会提出澄清。
- @毕晓普,问题是Zend是否会把PHP交给Facebook。Facebook可以直接从Zend购买php.net。还有,通过"stas",你说的是"stas malyshev"?
- php的+和array_merge的行为是反常的和非故意的。它们与简单的英语阅读会直观地告诉你"添加"或"合并"数组会做的相反。其他语言/库使用+连接列表(例如在python中)和"merge"函数,将键/值对从一个对象添加到另一个对象(例如在lodash中)。但在PHP中,情况则相反;array_merge可以用于连接类似列表的数组,但+不能。与array_merge不同,+总是执行在任何其他语言中都称为"合并"的操作。
- @Markamery肯定同意这一点,似乎数字数组是关联数组的二级公民,或者它们可能只是带有数字键的关联数组。我认为可能只有一个array_concat方法作为array_merge的别名。这与python是一致的,因为dict连接被视为合并它们。
- @ICC97它们实际上只是哈希图。见nikic.github.io/2014/12/22/…
- 我试过提交一个bug来查看是否可以为array_merge创建别名array_concat。
我发现使用它的最佳示例是在配置数组中。
1 2 3 4
| $user_vars = array("username"=>"John Doe");
$default_vars = array("username"=>"Unknown","email"=>"[email protected]");
$config = $user_vars + $default_vars; |
顾名思义,$default_vars是默认值的数组。$user_vars数组将覆盖$default_vars中定义的值。$user_vars中任何缺少的值现在都是$default_vars中的默认变量。
这将使cx1〔8〕成为:
希望这有帮助!
此运算符接受两个数组的并集(与"数组合并"相同,但"数组合并"的重复键将被覆盖)。
在这里可以找到数组运算符的文档。
- 这里对初学者来说是一个警告,如果任何一个数组为空,则操作结果为空。有些人可能不关心这个假设,因为它是一个联合操作,如果其中一个为空,则结果将是正确的(非空)数组。但是,如果其中一个数组是空的数组,那么这是正确的。
- 因此,作为一个好的实践,我认为我们应该将输入数组初始化为空数组。你们说什么?
如果需要保留数字键或不想释放任何内容,请谨慎使用数字键
1 2
| $a = array(2 =>"a2", 4 =>"a4", 5 =>"a5");
$b = array(1 =>"b1", 3 =>"b3", 4 =>"b4"); |
联盟
1 2 3 4 5 6 7 8 9
| print_r($a+$b);
Array
(
[2] => a2
[4] => a4
[5] => a5
[1] => b1
[3] => b3
) |
合并
+运算符产生的结果与array_replace()相同。但是,由于运算符参数是相反的,因此结果数组的顺序也可能不同。
在此页面的另一个示例上展开:
1 2 3 4 5
| $array1 = array('one', 'two', 'foo' => 'bar');
$array2 = array('three', 'four', 'five', 'foo' => 'baz');
print_r($array1 + $array2);
print_r(array_replace ($array2, $array1)); //note reversed argument order |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Array
(
[0] => one // preserved from $array1
[1] => two // preserved from $array1
[foo ] => bar // preserved from $array1
[2] => five // added from $array2
)
Array
(
[0] => one // preserved from $array1
[1] => two // preserved from $array1
[2] => five // added from $array2
[foo ] => bar // preserved from $array1
) |
- +的订单是否得到规范的保证?那array_replace呢?
Array plus operation treats all array as assoc array.
When key conflict during plus, left(previous) value will be kept
我发布下面的代码以使事情清楚。
$a + $b = array_plus($a, $b)
1 2 3 4 5 6
| function array_plus ($a, $b){
$results = array();
foreach($a as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
foreach($b as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
return $results;
} |
- @Tamlyn的代码运行似乎证明了您的声明"array plus操作将所有数组视为assoc数组"是错误的。
- 塔姆林的密码证明了我是对的
它将把新数组追加到前一个数组。
数组([0]=>示例[1]=>测试)
- 这个线程多次提到数组_Merge()不一致。
- @"一致"?意义?
- 它们不一样。