Array_merge与+

Ell*_*lly 110 php arrays array-merge

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

随着+该密钥将被保留,但它不与关联数组.

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

Chr*_*ong 143

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

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

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

array_merge() 行为略有不同:

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

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

  • 在我们的代码库中,我们停止使用+和array_merge作为数组,而是使用我们编写的两个新函数."array_merge_by_key"和"array_concat"而不是单个函数,其启发式试图猜测你想要的是什么 (4认同)
  • 嗯......所以`+`就像是带反向参数的array_merge,没有数字键重新编号?这意味着我只需要反转我的参数 (2认同)

Guc*_*Koo 27

这两个操作完全不同.

数组加

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

array_merge()

  1. array_merge()与index-array和assoc-array的工作方式不同.
  2. 如果两个参数都是索引数组,则array_merge()连接索引数组值.
  3. 如果没有,索引数组将转换为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;
}
Run Code Online (Sandbox Code Playgroud)

  • 示例代码很棒,但是很难阅读。如果格式正确,那就更好了... (2认同)