array_merge or + in PHP
PHP has several ways of combining two arrays into one. You can use array_merge
or the +
operator.
There's a subtle difference between these two methods though, a difference worth knowing.
Let's take a look at how these two methods compare:
array_merge($first, $second);
// vs.
$first + $second;
Let's say these are the two arrays we're working with:
$first = [
'a',
'b',
];
$second = [
'c',
];
This would be the result of a simple array_merge
call:
array_merge($first, $second);
[
'a',
'b',
'c',
]
While the +
operator gives us this result:
$first + $second;
[
'a',
'b',
]
Switching the operands while using the +
operator, gives a different result:
$second + $first;
[
'c',
'b',
]
Confused? So was I.
Let's write out the $first
and $second
arrays in full, with their indices.
This will make things more clear:
$first = [
0 => 'a',
1 => 'b',
];
$second = [
0 => 'c',
];
By now you can probably guess what's going on:
the +
operator will only add the elements of the rightside operand, if their key
doesn't exist in the leftside operand, while array_merge
will override existing keys.
By that definition, we can also determine that +
can never be used to recursively merge arrays,
as it will leave existing elements untouched:
$first = [
'A' => [
'B' => true,
'C' => true,
],
];
$second = [
'A' => [
'B' => false,
'C' => false,
],
];
$first + $second;
Here's the result:
[
'A' => [
'B' => true,
'C' => true,
],
]
While using array_merge
, would give this result:
[
'A' => [
'B' => false,
'C' => false,
],
]
"Hang on", I hear you say, "isn't that what array_merge_recursive
is supposed to do?".
Here we have a case of unfortunate naming. Please don't be surprisedβββit's PHP after all.
See, array_merge
will merge matching elements by overriding them.
array_merge_recursive
on the other hand will keep both elements, and merge them in a new array, keeping both values.
This is what our previous example would look like, using array_merge_recursive
:
[
'A' => [
'B' => [
true,
false,
],
'C' => [
true,
false,
],
],
]
What about merging multiple arrays? You can probably guess the outcome by now:
$first = ['a'];
$second = ['b'];
$third = ['c'];
Here's what array_merge
results in:
array_merge($first, $second, $third)
[
'a',
'b',
'c',
]
Chaining the +
operator also works, with the following result:
$first + $second + $third
[
'a',
]
With this little refresher, I hope that you won't find yourself confused anymore when you're deep into your code and need to merge arrays.
I found it to be a cognitive burden when I had to stop and think about "hang on, what is the correct way to do this?". Luckily now, we know!