Добавляем элементы в хвост массива: руководство PHP

Раздел: основы 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. Это полезно для установки значений по умолчанию.

добавление элемента в конец массива PHP - comments

En
Php добавить массив в конец массива (php)