129

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

保留了+键,但不适用于关联数组。

我不明白这是如何工作的,谁能给我解释一下?

4

2 回答 2

173

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

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

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

array_merge()行为略有不同:

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

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

于 2011-08-14T21:09:02.433 回答
35

这两种操作完全不同。

数组加

  1. 数组加运算将所有数组视为关联数组。
  2. 加时键冲突时,保留左(前)值
  3. null + array()将引发致命错误

数组合并()

  1. array_merge() 与 index-array 和 assoc-array 的工作方式不同。
  2. 如果两个参数都是索引数组,array_merge() 连接索引数组值。
  3. 如果不是,则 index-array 将转换为 values 数组,然后转换为 assoc 数组。
  4. 现在它得到了两个 assoc 数组并将它们合并在一起,当键冲突时,将保留右(最后一个)值。
  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;
}
于 2014-12-31T07:33:59.367 回答