Search code examples
phparraysmerging-data

array_replace() vs. union operator in PHP


In PHP, (given that $a, $b and $c are arrays) is $a = array_replace($b, $c) always functionally identical to $a = $c + $b?

I can't seem to find any edge cases that would indicate otherwise.

(just working with one dimension, this question isn't concerned with recursion, ie: array_replace_recursive())


Edit: I found a note in a comment that suggests that the union operator will preserve references, but I haven't noticed array_replace() failing to do that.


Solution

  • EDIT: Ah sorry, I didn't notice the arguments were reversed. The answer is yes, then, because the resulting array always has the two arrays merged, but while + gives priority to values in the first array and array_replace to the second.

    The only actual difference would be in terms of performance, where + may be preferable because when it finds duplicates it doesn't replace the value; it just moves on. Plus, it doesn't entail a (relatively expensive) function call.


    No. array_replace replaces elements, while + considers the first value:

    <?php
    print_r(array_replace([0 => 1], [0 => 2]));
    print_r([0 => 1] + [0 => 2]);
    
    Array
    (
        [0] => 2
    )
    Array
    (
        [0] => 1
    )
    

    To cite the manual:

    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.

    As for references, they are preserved in both cases.