Array_merge 与 +

当我将 array_merge()与关联数组一起使用时,我得到了我想要的结果,但是当我将它们与数字键数组一起使用时,键被改变了。

对于 +,键被保留,但是它不能用于关联数组。

我不明白这是怎么回事,有人能给我解释一下吗?

55342 次浏览

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

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

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

array_merge()的行为略有不同:

如果输入数组具有相同的字符串键,那么该键的后一个值将覆盖前一个。但是,如果数组包含数值键,则后面的值将不会覆盖原始值,而是附加在后面。输入数组中具有数字键的值将用从结果数组中的零开始的递增键重新编号。

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

这两个行动完全不同。

数组 +

  1. 数组加操作将所有数组视为 assoc 数组。
  2. 当加号期间键冲突时,将保留左(上一个)值
  3. null + array()将引发致命错误

Array _ merge ()

  1. Array _ merge ()与 index-array 和 assoc-array 的工作原理不同。
  2. 如果两个参数都是索引数组,则 array _ merge ()连接索引数组值。
  3. 如果没有,索引数组将转换为值数组,然后转换为 assoc 数组。
  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;
}