Добавляем элементы в хвост массива: руководство PHP
Основные способы добавления элемента в конец массива в PHP
Какой способ самый эффективный для добавления одного элемента?
Наиболее эффективный способ - использование синтаксиса $array[] = $value. Он не вызывает функцию, работает напрямую и является самым быстрым. Подходит для добавления любого значения (числа, строки, массива, объекта) в конец числового или ассоциативного массива (если индекс не указывается, PHP автоматически присваивает следующий числовой ключ).
<?php
$fruits = ['apple', 'banana'];
$fruits[] = 'orange';
print_r($fruits);
?>
Array
(
[0] => apple
[1] => banana
[2] => orange
)
Пояснение:
Оператор [] автоматически определяет следующий доступный числовой ключ (в примере 2). Если массив пуст, ключ станет 0. Этот способ не возвращает новую длину массива, что может быть недостатком при необходимости сразу получить количество элементов.
count().Как добавить один элемент с помощью функции array_push?
Функция array_push добавляет переданные элементы в конец массива по ссылке и возвращает новое количество элементов в массиве. Пример для одного элемента:
<?php
$colors = ['red', 'green'];
$newCount = array_push($colors, 'blue');
echo $newCount; // 3
print_r($colors);
?>
3
Array
(
[0] => red
[1] => green
[2] => blue
)
Цель и случаи использования:
Когда нужно не только добавить элемент, но и сразу получить новую длину массива. Однако для одного элемента вызов функции менее эффективен, чем синтаксис []. Рекомендуется использовать array_push только при добавлении нескольких элементов за один раз.
array_push всегда присваивает числовые ключи, что может нарушить ожидаемую структуру ассоциативного массива (элементы с явными ключами не будут добавлены, а новые получат индексы).Как добавить несколько элементов одним вызовом?
array_push принимает неограниченное количество аргументов, что удобно для массового добавления:
<?php
$numbers = [1, 2];
array_push($numbers, 3, 4, 5);
print_r($numbers);
?>
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Цель:
Уменьшить количество операций записи при добавлении нескольких элементов в конец. По производительности это эквивалентно последовательному использованию [], но код становится компактнее.
Как добавить элемент в конец ассоциативного массива с указанием ключа?
Для ассоциативных массивов используется присваивание по ключу: $array['ключ'] = значение. Это добавляет новый элемент или перезаписывает существующий, если ключ уже существует.
<?php
$student = ['name' => 'Иван', 'age' => 20];
$student['city'] = 'Москва';
print_r($student);
?>
Array
(
[name] => Иван
[age] => 20
[city] => Москва
)
Цель:
Добавление элемента с конкретным строковым или числовым ключом. Это основной способ для ассоциативных массивов. Порядок добавления сохраняется (в PHP 7+ сохраняется порядок вставки, а не ключа).
array_push для добавления с ключом - это неверно, так как array_push игнорирует явные ключи.Как добавить массив как вложенный элемент в конец другого массива?
Чтобы вложить один массив в другой (создать многомерную структуру), используются те же методы: $outer[] = $inner или array_push($outer, $inner). Добавленный массив станет элементом внешнего массива с числовым ключом.
<?php
$matrix = [];
$row1 = [1, 2];
$row2 = [3, 4];
$matrix[] = $row1;
array_push($matrix, $row2);
print_r($matrix);
?>
Array
(
[0] => Array
(
[0] => 1
[1] => 2
)
[1] => Array
(
[0] => 3
[1] => 4
)
)
Цель:
Создание массивов массивов (например, матриц, списков записей). Важно понимать, что добавляется сам массив как элемент, а не его содержимое.
array_merge или оператор +.Как объединить два массива, добавив все элементы одного в конец другого?
Для слияния массивов применяется функция array_merge:
<?php
$first = ['a', 'b'];
$second = ['c', 'd'];
$merged = array_merge($first, $second);
print_r($merged);
?>
Array
(
[0] => a
[1] => b
[2] => c
[3] => d
)
Другие способы слияния:
- Оператор
+- добавляет только те ключи из второго массива, которых нет в первом. Для числовых массивов не даёт слияния (сохраняет индексы первого). - Spread оператор
...(PHP 7.4+):$result = [...$first, ...$second];- аналогиченarray_mergeдля числовых массивов.
<?php
$first = ['x' => 10, 'y' => 20];
$second = ['y' => 30, 'z' => 40];
// array_merge перезаписывает одинаковые строковые ключи
$mergeResult = array_merge($first, $second);
print_r($mergeResult);
?>
Array
(
[x] => 10
[y] => 30
[z] => 40
)
Цель:
Создание нового массива, содержащего элементы исходных. array_merge переиндексирует числовые ключи, а строковые перезаписываются последним значением. Оператор + не переиндексирует и не перезаписывает существующие ключи.
+ и array_merge. Оператор + не сливает числовые массивы как ожидается.Продвинутые примеры и альтернативные способы добавления
Пример 1: Использование оператора spread для создания нового массива
Оператор ... (spread) позволяет развернуть массив в другом массиве. С PHP 7.4 можно добавлять элементы в конец без изменения исходного массива.
<?php
$original = [1, 2, 3];
$extended = [...$original, 4, 5];
print_r($extended);
print_r($original);
?>
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Исходный массив остался неизменным. Этот способ полезен, когда требуется иммутабельность.
Пример 2: Вставка в конец с помощью array_splice
Функция array_splice может использоваться для вставки в любую позицию, в том числе в конец (offset = длина массива, length = 0).
<?php
$list = ['a', 'b', 'c'];
array_splice($list, count($list), 0, 'd');
print_r($list);
?>
Array
(
[0] => a
[1] => b
[2] => c
[3] => d
)
Этот способ менее эффективен и редко применяется, но может быть полезен при условной вставке в середину или конец.
Пример 3: Добавление в цикле – сравнение скорости [] и array_push
Для добавления множества элементов в цикле рекомендуется использовать синтаксис []. Пример с микроизмерениями:
<?php
$start = microtime(true);
$arr = [];
for ($i = 0; $i < 100000; $i++) {
$arr[] = $i;
}
echo '[]: ' . (microtime(true) - $start) . "\n";
$start = microtime(true);
$arr2 = [];
for ($i = 0; $i < 100000; $i++) {
array_push($arr2, $i);
}
echo 'array_push: ' . (microtime(true) - $start) . "\n";
?>
[]: 0.0051 array_push: 0.0078
Результаты зависят от окружения, но [] обычно быстрее из-за отсутствия накладных расходов на вызов функции.
Пример 4: Добавление строк в многомерный массив (таблица)
Создание списка записей (например, из базы данных) путём последовательного добавления ассоциативных массивов.
<?php
$users = [];
$users[] = ['id' => 1, 'name' => 'Alice'];
$users[] = ['id' => 2, 'name' => 'Bob'];
array_push($users, ['id' => 3, 'name' => 'Charlie']);
print_r($users);
?>
Array
(
[0] => Array
(
[id] => 1
[name] => Alice
)
[1] => Array
(
[id] => 2
[name] => Bob
)
[2] => Array
(
[id] => 3
[name] => Charlie
)
)
Пример 5: Объединение ассоциативных массивов с помощью оператора +
Оператор + сохраняет все ключи первого массива и добавляет только отсутствующие ключи из второго.
<?php
$defaults = ['theme' => 'light', 'lang' => 'ru'];
$custom = ['lang' => 'en', 'font' => 'arial'];
$result = $defaults + $custom;
print_r($result);
?>
Array
(
[theme] => light
[lang] => ru
[font] => arial
)
Ключ 'lang' из $custom игнорируется, так как уже существует в $defaults. Это полезно для установки значений по умолчанию.