Может ли кто-нибудь помочь мне объяснить это? У меня есть два фрагмента кода, один работает, как я ожидаю, а другой нет.
Это работает
$a = array('a' => 1, 'b' => 2); $b = array('c' => 3); $c = $a + $b; print_r($c); // Output Array ( [a] => 1 [b] => 2 [c] => 3 )
Это не
$a = array('a', 'b'); $b = array('c'); $c = $a + $b; print_r($c); // Output Array ( [0] => a [1] => b )
Что здесь происходит?? Почему вторая версия не объединяет два массива? Что я неправильно понял? Что я должен делать вместо этого? Или это ошибка в PHP?
Это документировано и правильно: http://us3.php.net/manual/en/language.operators.array.php
Оператор + добавляет элементы оставшихся ключей из массива правой руки в левую руку, тогда как дублированные ключи НЕ перезаписываются.
Поэтому я думаю, что это не ошибка в php, и что, возможно, произойдет. Я этого раньше не заметил.
Чтобы добавить два неассоциативных массива, вам нужно использовать функцию array_merge
:
Объединяет элементы одного или нескольких массивов вместе так, чтобы значения одного добавлялись к концу предыдущего. Он возвращает результирующий массив.
Если входные массивы имеют одинаковые строковые ключи, то более позднее значение для этого ключа перезапишет предыдущий. Если, однако, массивы содержат числовые клавиши, более поздняя величина не будет перезаписывать исходное значение, но будет добавлена.
Если задан только один массив, и массив численно проиндексирован, ключи будут повторно проиндексированы непрерывным образом.
Короче говоря, это работает, потому что, если вы печатаете_r как $ a, так и $ b, у вас есть:
Array ( [a] => 1 [b] => 2 )
а также
Array ( [c] => 3 )
поскольку вы можете видеть, что все элементы имеют разные ключи …
как для второго массива примеров, если вы печатаете $ a и $ b, у вас есть:
Array ( [0] => a [1] => b )
а также
Array ( [0] => c )
и что ключ 0 для «a» и «c» является проблемой здесь, элементы второго массива с одинаковыми ключами отбрасываются … если вы выполните:
$c = $b + $a; // instead of $c = $a + $b;
результатом будет:
Array ( [0] => c [1] => b )
Я думаю, что это просто недокументированное поведение, но я, вероятно, ошибаюсь. В любом случае, если вы пытаетесь объединить массивы, используйте array_merge
При работе с массивами оператор плюс не перезаписывает индексы и не переиндексирует массивы. В вашем примере c
имеет индекс 0 как a
, поэтому он отбрасывается. Используйте array_merge.
array_splice($a,count($a),0,$b); //array $a becomes a group of $a and $b arrays.
PS это для индексированных массивов (не ассоциативных)