What's the difference between array_merge and array + array?

后端 未结 9 1610
遥遥无期
遥遥无期 2020-11-29 21:26

A fairly simple question. What\'s the difference between:

$merged = array_merge($array1, $array2);

and

$merged = $array1 +          


        
相关标签:
9条回答
  • 2020-11-29 22:03

    The difference is:

    The + operator takes the union of the two arrays, whereas the array_merge function takes the union BUT the duplicate keys are overwritten.

    0 讨论(0)
  • 2020-11-29 22:06

    The + sign only takes the value from the first occurence of an array key.
    array_merge takes the value from the last occurrence of an array key.

    Example:

    $first = ['a'=>'one',
            'b'=>'two',
            'c'=>'three'];
    
    $second = ['a'=>'fourth',
            'b'=>'fifth',
            'c'=>'sixth',
            '3'=>'number three'];
    
    $merged = $first + $second;
    echo "<pre> plus sign merge\n";
    var_dump($merged);
    
    $merged = array_merge($first,$second);
    echo "\n array_merge function merge\n";
    var_dump($merged);
    

    This outputs:

    plus sign merge
    array(4) {
    ["a"]=>
    string(3) "one"
    ["b"]=>
    string(3) "two"
    ["c"]=>
    string(5) "three"
    [3]=>
    string(12) "number three"
    }

    array_merge function merge
    array(4) {
    ["a"]=>
    string(6) "fourth"
    ["b"]=>
    string(5) "fifth"
    ["c"]=>
    string(5) "sixth"
    [0]=>
    string(12) "number three"
    }

    Interesting to note in this is that the array_merge actally erases the '3' index of number three even though it's a string, because it's a number.

    So take care when merging with array_merge arrays with numerical indexes. They might lose their keys. if they are important to you precede them with a string.

    so instead of '3' => 'three' use something like '_3' => 'three'

    0 讨论(0)
  • 2020-11-29 22:08

    Here's a simple illustrative test:

    $ar1 = [
       0  => '1-0',
      'a' => '1-a',
      'b' => '1-b'
    ];
    
    
    $ar2 = [
       0  => '2-0',
       1  => '2-1',
      'b' => '2-b',
      'c' => '2-c'
    ];
    
    print_r($ar1+$ar2);
    
    print_r(array_merge($ar1,$ar2));
    

    with the result:

    Array
    (
      [0] => 1-0
      [a] => 1-a
      [b] => 1-b
      [1] => 2-1
      [c] => 2-c
    )
    Array
    (
      [0] => 1-0
      [a] => 1-a
      [b] => 2-b
      [1] => 2-0
      [2] => 2-1
      [c] => 2-c
    )
    

    Notice that duplicate non-numeric keys will take the first value using the union operator but the later one using the array_merge.

    For numeric keys, the first value will be used with the union operator whereas the all the values will be used with the array_merge, just reindexed.

    I generally use union operator for associative arrays and array_merge for numeric. Of course, you can just as well use the array_merge for associative, just that the later values overwrite earlier ones.

    0 讨论(0)
提交回复
热议问题