Array_merge与+

当我使用array_merge()与关联数组时,我得到了我想要的,但是当我用数字键arrays来使用它们时,键会被改变。

+键保留,但不能与关联数组一起使用。

我不明白这是如何工作的,有人可以向我解释吗?

因为两个数组都是数字索引的,所以只会使用第一个数组中的值。

+运算符返回附加到左侧数组的右侧数组; 对于两个数组中存在的键,将使用左侧数组中的元素,而右侧数组中的匹配元素将被忽略。

http://php.net/manual/en/language.operators.array.php

array_merge()具有稍微不同的行为:

如果input数组具有相同的string键,则该键的较晚值将覆盖前一个键。 但是,如果数组包含数字键,则后面的值不会覆盖原始值,但会被追加。 使用数字键input数组中的值将使用结果数组中从零开始的递增键进行重新编号。

http://php.net/manual/en/function.array-merge.php

这两个操作是完全不同的。

数组加上

  1. Array plus操作将所有数组视为assoc数组。
  2. 当加号,左(前)值的关键冲突将被保留
  3. null + array()会引发致命错误

array_merge()

  1. array_merge()与index-array和assoc-array不同。
  2. 如果两个参数都是索引数组,则array_merge()concat索引数组值。
  3. 如果没有,索引数组将转换为数组数组,然后转换为关联数组。
  4. 现在它得到了两个assoc数组并将它们合并在一起,当关键冲突时,right(last)的值将被保留。
  5. array_merge(null, array())返回array()并得到一个警告说,参数#1不是一个数组。

我张贴下面的代码来说明事情。

 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; } //---------------------------------------------------------------- function is_index($a){ $keys = array_keys($a); foreach($keys as $key) { $i = intval($key); if("$key"!="$i") return false; } return true; } function array_merge($a, $b){ if(is_index($a)) $a = array_values($a); if(is_index($b)) $b = array_values($b); $results = array(); if(is_index($a) and is_index($b)){ foreach($a as $v) $results[] = $v; foreach($b as $v) $results[] = $v; } else{ foreach($a as $k=>$v) $results[$k] = $v; foreach($b as $k=>$v) $results[$k] = $v; } return $results; }