phparraysmerging-data

Merging two arrays with the "+" (array union operator) How does it work?


I have some code that appears to merge the data from two arrays using +=, but it doesn't include all of the elements in the element. How does it work?

Example:

$test = array('hi');
$test += array('test', 'oh');
var_dump($test);

Output:

array(2) {
  [0]=>
  string(2) "hi"
  [1]=>
  string(2) "oh"
}

What does + mean when used on arrays in PHP?


Solution

  • Quoting from the PHP Manual on Language Operators

    The + operator returns the right-hand array appended to the left-hand array; for keys that exist in both arrays, the elements from the left-hand array will be used, and the matching elements from the right-hand array will be ignored.

    So if you do

    $array1 = ['one',   'two',          'foo' => 'bar'];
    $array2 = ['three', 'four', 'five', 'foo' => 'baz']; 
    
    print_r($array1 + $array2);
    

    You will get

    Array
    (
        [0] => one   // preserved from $array1 (left-hand array)
        [1] => two   // preserved from $array1 (left-hand array)
        [foo] => bar // preserved from $array1 (left-hand array)
        [2] => five  // added from $array2 (right-hand array)
    )
    

    So the logic of + is equivalent to the following snippet:

    $union = $array1;
    
    foreach ($array2 as $key => $value) {
        if (false === array_key_exists($key, $union)) {
            $union[$key] = $value;
        }
    }
    

    If you are interested in the details of the C-level implementation head to


    Note, that + is different from how array_merge() would combine the arrays:

    print_r(array_merge($array1, $array2));
    

    would give you

    Array
    (
        [0] => one   // preserved from $array1
        [1] => two   // preserved from $array1
        [foo] => baz // overwritten from $array2
        [2] => three // appended from $array2
        [3] => four  // appended from $array2
        [4] => five  // appended from $array2
    )
    

    See linked pages for more examples.