Как добавить один массив в другой, не сравнивая их ключи?
$a = array( 'a', 'b' );
$b = array( 'c', 'd' );
В конце это должно быть: Array( [0]=>a [1]=>b [2]=>c [3]=>d )
Если я использую что-то вроде []
или array_push
, это вызовет один из следующих результатов:
Array( [0]=>a [1]=>b [2]=>Array( [0]=>c [1]=>d ) )
//or
Array( [0]=>c [1]=>d )
Это должно быть что-то, делающее это, но более элегантно:
foreach ( $b AS $var )
$a[] = $var;
array_merge ($a, $b)
должен делать именно то, что вы хотите, по крайней мере, с PHP 5+.array_merge();
результатов неarray_merge();
должен быть точным, что вам нужно:print_r(array_merge($a,$b)); // outputs => Array ( [0] => a [1] => b [2] => c [3] => d )
Ответы:
array_merge
это элегантный способ:Делать что-то вроде:
Не будет работать, потому что
+
оператор фактически не объединяет их. Если у них$a
те же ключи, что$b
и у него, он ничего не сделает.источник
Другой способ сделать это в PHP 5.6+ - использовать
...
токен.Это также будет работать с любым
Traversable
Предупреждение , хотя:
$b
массив пустой или не проходимый, например, не массив$b
оно не проходимоисточник
...
обычноsplat operator
в php.array_push
принимает один аргумент начиная с php 7.3, что предотвращает ошибки с пустыми массивами.Почему бы не использовать
Почему вы не хотите использовать этот, правильный, встроенный метод.
источник
PHP append one array to another (not array_merge or array_push)
... впоследствии изменен на,PHP append one array to another (not array_merge or +)
прежде чем сменить его на текущее названиеЭто довольно старый пост, но я хочу добавить кое-что о добавлении одного массива в другой:
Если
Вы можете использовать функции массива следующим образом:
array_merge не объединяет числовые ключи, поэтому добавляет все значения $ appendArray. При использовании нативных функций php вместо цикла foreach, он должен быть быстрее на массивах с большим количеством элементов.
Добавление 2019-12-13: Начиная с PHP 7.4, есть возможность добавлять или добавлять массивы в виде оператора Array Spread Operator:
Как и прежде, ключи могут быть проблемой с этой новой функцией:
«Неустранимая ошибка: неперехваченная ошибка: невозможно распаковать массив со строковыми ключами»
array (4) {[1] => int (1) [4] => int (2) [5] => int (3) [6] => int (4)}
array (3) {[0] => int (1) [1] => int (4) [3] => int (3)}
источник
Вывод:
Ссылочный исходный код
источник
Для большого массива лучше объединить без array_merge, чтобы избежать копирования памяти.
источник
Исходя из ответов bstoney и Snark, я провел несколько тестов по различным методам:
Который производит:
ОРИГИНАЛ: Я полагаю, что в PHP 7 метод 3 является значительно лучшей альтернативой из-за того, как теперь работают циклы foreach , то есть для создания копии итеративного массива.
Хотя метод 3 не является строго ответом на критерии «не array_push» в вопросе, это одна строка и самая высокая производительность во всех отношениях, я думаю, что вопрос задавался до того, как синтаксис ... был опцией.
ОБНОВЛЕНИЕ 25/03/2020: я обновил тест, который был ошибочным, поскольку переменные не были сброшены. Интересно (или запутанно), что результаты теперь показывают, что тест 1 был самым быстрым, где он был самым медленным, пройдя от 0,008392 до 0,002717! Это может быть связано только с обновлениями PHP, поскольку на это не повлиял бы недостаток тестирования.
Итак, сага продолжается, теперь я начну использовать array_merge!
источник
Начиная с PHP 7.4 вы можете использовать ... оператор . Это также известно как оператор splat в других языках, включая Ruby.
Вывод
Оператор Splat должен иметь лучшую производительность, чем array_merge . Это связано не только с тем, что оператор splat является языковой структурой, а array_merge является функцией, но также с тем, что оптимизация времени компиляции может быть выполнена для постоянных массивов.
Более того, мы можем использовать синтаксис оператора splat везде в массиве, так как нормальные элементы могут быть добавлены до или после оператора splat.
источник
До PHP7 вы можете использовать:
array_splice()
работает со ссылкой на массив (1-й аргумент) и помещает значения массива (4-й аргумент) вместо списка значений, начинающегося со 2-го аргумента и номера 3-го аргумента. Когда мы устанавливаем 2-й аргумент как конец массива источника и 3-й как ноль, мы добавляем значения 4-го аргумента к 1-му аргументуисточник
если вы хотите объединить пустой массив с существующим новым значением. Вы должны инициализировать это сначала.
Надеюсь, это поможет.
источник
Цикл foreach выполняется быстрее, чем array_merge, чтобы добавлять значения в существующий массив, поэтому вместо этого выберите цикл, если хотите добавить массив в конец другого.
источник
Как насчет этого:
источник
'0' => 'a'
... а не0 => 'a'
?array + array