Не могу объединить 2 массива в PHP - PullRequest
51 голосов
/ 16 апреля 2010

Недавно я узнал, как объединить 2 массива с помощью оператора + в PHP.

Но рассмотрим этот код ...

$array = array('Item 1');

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

var_dump($array);

Выход

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

Почему это не работает? Пропуск сокращения и использование $array = $array + array('Item 2') также не работает. Это как-то связано с клавишами?

Ответы [ 10 ]

109 голосов
/ 16 апреля 2010

Оба будут иметь ключ 0, и этот метод объединения массивов свернет дубликаты. Попробуйте использовать array_merge() вместо.

$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);

Если бы элементы в вашем массиве использовали разные ключи, оператор + был бы более уместным.

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

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

Редактировать: Добавлен фрагмент кода для уточнения

8 голосов
/ 16 апреля 2010

Использование array_merge()
Смотри документацию здесь:
http://php.net/manual/en/function.array-merge.php

Объединяет элементы одного или нескольких массивов вместе, так что значения одного добавляются в конец предыдущего. Возвращает результирующий массив.

6 голосов
/ 03 января 2012

Все предыдущие ответы неверны! merge фактически объединяет массивы, то есть, если у массивов есть общий элемент, одна из копий будет опущена. То же самое касается союза .

Я не нашел "обходного пути" для этой проблемы, но на самом деле сделать это вручную ...

вот так:

<?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);
?>
6 голосов
/ 16 апреля 2010

+ называется оператором объединения, который отличается от оператора конкатенации (в PHP нет такового для массивов). описание ясно говорит:

Оператор + добавляет элементы оставшихся ключей из правого массива в левую, тогда как дублированные ключи НЕ перезаписываются.

С примером:

$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"
}

Поскольку оба ваших массива имеют одну запись с ключом 0, результат ожидается.

Чтобы объединить, используйте array_merge.

3 голосов
/ 16 апреля 2010

Попробуйте array_merge.

$array1 = array('Item 1');

$array2 = array('Item 2');

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

Я думаю, что это потому, что вы не назначаете ключ ни одному, поэтому у них обоих есть ключ 0, и + не переиндексирует, поэтому он пытается перезаписать его.

2 голосов
/ 16 апреля 2010

Это действительно ключевой конфликт. При объединении массивов дубликаты ключей не перезаписываются.

Вместо этого вы должны использовать array_merge()

$array = array_merge(array('Item 1'), array('Item 2'));
2 голосов
/ 16 апреля 2010
$array = array('Item 1');

array_push($array,'Item 2');

или

$array[] = 'Item 2';
0 голосов
/ 19 апреля 2018

Это работает для неассоциативных массивов:

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

0 голосов
/ 03 июня 2015

вы можете использовать оператор. $ array3 = $ array1. $ array2;

0 голосов
/ 16 апреля 2010

Попробуйте сказать

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

Хотя похоже, что вы пытаетесь добавить массив в массив, таким образом $array[][], но это не то, что предлагает ваш заголовок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...