68

I've recently learned how to join 2 arrays using the + operator in PHP.

But consider this code...

$array = array('Item 1');

$array += array('Item 2');

var_dump($array);

Output is

array(1) { [0]=> string(6) "Item 1" }

Why does this not work? Skipping the shorthand and using $array = $array + array('Item 2') does not work either. Does it have something to do with the keys?

alex
  • 438,662
  • 188
  • 837
  • 957
  • *(related)* http://stackoverflow.com/questions/2140090/operator-for-array-in-php/2140094#2140094 – Gordon Apr 16 '10 at 07:30

11 Answers11

142

Both will have a key of 0, and that method of combining the arrays will collapse duplicates. Try using array_merge() instead.

$arr1 = array('foo'); // Same as array(0 => 'foo')
$arr2 = array('bar'); // Same as array(0 => 'bar')

// Will contain array('foo', 'bar');
$combined = array_merge($arr1, $arr2);

If the elements in your array used different keys, the + operator would be more appropriate.

$arr1 = array('one' => 'foo');
$arr2 = array('two' => 'bar');

// Will contain array('one' => 'foo', 'two' => 'bar');
$combined = $arr1 + $arr2;

Edit: Added a code snippet to clarify

awgy
  • 15,218
  • 4
  • 22
  • 17
  • 25
    Note that the array_merge function will still collapse duplicates of non-numeric array keys. eg array_merge(array("colour"=>"red"), array("colour"=>"green")) will produce the value of array("colour"=>"green); – Highly Irregular Nov 08 '11 at 02:04
  • 1
    $arr1 = array('foo'); // Same as array(0 => 'foo') $arr2 = array('bar'); // Same as array(0 => 'bar') // Will contain array('bar'); $combined = array_merge($arr1, $arr2); – xoxn-- 1'w3k4n Jun 05 '16 at 13:13
  • `array(123 => 'foo')` is the same as `array("123" => 'foo')` and when keys are integers they're ignored when using `array_merge`. Have a look at [this test](http://sandbox.onlinephpfunctions.com/code/742843156050d2f20e0d2c11d13c0fd938b652cf) – luukvhoudt May 01 '20 at 09:48
9

Use array_merge()
See the documentation here:
http://php.net/manual/en/function.array-merge.php

Merges the elements of one or more arrays together so that the values of one are appended to the end of the previous one. It returns the resulting array.

Christopher Altman
  • 4,690
  • 2
  • 28
  • 48
7

IMO some of the previous answers are incorrect! (It's possible to sort the answers to start from oldest to newest).

array_merge() actually merges the arrays, meaning, if the arrays have a common item one of the copies will be omitted. Same goes for + (union).

I didn't find a "work-around" for this issue, but to do it manually...

Here it goes:

<?php
$part1 = array(1,2,3);
echo "array 1 = \n";
print_r($part1);
$part2 = array(4,5,6);
echo "array 2 = \n";
print_r($part2);
$ans = NULL;
for ($i = 0; $i < count($part1); $i++) {
    $ans[] = $part1[$i];
}
for ($i = 0; $i < count($part2); $i++) {
    $ans[] = $part2[$i];
}
echo "after arrays concatenation:\n";
print_r($ans);
?>
Nir Alfasi
  • 49,889
  • 11
  • 75
  • 119
  • 18
    This is false. `array_merge` will only omit items from the resultant array if they are _associative_ arrays with the same keys. For numerical arrays, _all_ items are merged into a new array, whose length is the precise sum of the original arrays. In the example you are using numerical arrays, which means `array_merge` would work flawlessly for you. I agree that `array_merge` should not be used for associative arrays, but clearly that's not what you're showing here. – JMTyler Mar 02 '13 at 20:07
  • @JMTyler +1 excellent comment! I should have chosen an example that uses associative arrays. The main reason I posted this answer was that the accepted answer used `+` which should not be used in either of the cases (associative or not) unless the keys are different. And array_merge which will contain duplicate items in case of identical items. – Nir Alfasi Mar 04 '13 at 23:19
  • 3
    “All previous answers are incorrect” is not helpful as answers are reordered depending on votes. – Christian Lescuyer Oct 30 '13 at 02:19
  • @ChristianLescuyer it's easy to see the date/hour next to each answer. – Nir Alfasi Oct 30 '13 at 03:23
6

+ is called the Union operator, which differs from a Concatenation operator (PHP doesn't have one for arrays). The description clearly says:

The + operator appends elements of remaining keys from the right handed array to the left handed, whereas duplicated keys are NOT overwritten.

With the example:

$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
$c = $a + $b;

array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  string(6) "cherry"
}

Since both your arrays have one entry with the key 0, the result is expected.

To concatenate, use array_merge.

deceze
  • 471,072
  • 76
  • 664
  • 811
3

Try array_merge.

$array1 = array('Item 1');

$array2 = array('Item 2');

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

I think its because you are not assigning a key to either, so they both have key of 0, and the + does not re-index, so its trying to over write it.

Rabbott
  • 4,044
  • 1
  • 28
  • 53
2
$array = array('Item 1');

array_push($array,'Item 2');

or

$array[] = 'Item 2';
Brant Messenger
  • 1,371
  • 9
  • 19
2

It is indeed a key conflict. When concatenating arrays, duplicate keys are not overwritten.

Instead you must use array_merge()

$array = array_merge(array('Item 1'), array('Item 2'));
NullUserException
  • 77,975
  • 25
  • 199
  • 226
Rupert Madden-Abbott
  • 12,204
  • 13
  • 54
  • 69
2

use the splat ( or spread ) operator:

  $animals = ['dog', 'cat', 'snake', 'pig', 'chicken'];
  $fruits = ['apple', 'banana', 'water melon'];
  $things = [...$animals, ...$fruits];

source: https://www.kindacode.com/article/merging-arrays-in-php-7/

Funkodebat
  • 5,229
  • 3
  • 36
  • 54
0

This works for non-associative arrays:

while(($item = array_shift($array2)) !== null && array_push($array1, $item));

Henry
  • 6,843
  • 2
  • 32
  • 35
-3

Try saying

$array[] = array('Item 2'); 

Although it looks like you're trying to add an array into an array, thus $array[][] but that's not what your title suggests.

Josh K
  • 26,152
  • 19
  • 79
  • 130
-5

you may use operator . $array3 = $array1.$array2;