Добавление значений в массивы: от простого к сложному

Раздел: Основы PHP -> Работа с массивами

Основные способы добавления элементов в массивы

Наиболее эффективное решение для добавления одного элемента в конец массива: прямой синтаксис $array[] = $value;. Этот способ не требует вызова функции, поэтому выполняется быстрее. Пример:


<?php
$numbers = [1, 2, 3];
$numbers[] = 4;
// $numbers теперь [1, 2, 3, 4]
?>

Переменная должна быть инициализирована как массив, иначе PHP создаст новый массив автоматически (но при строгих настройках может появиться предупреждение).

Типичная ошибка: попытка использовать $array[] для чтения, например echo $array[]; вызовет синтаксическую ошибку. Данная конструкция допустима только в левой части присваивания.

Как добавить несколько элементов в конец массива с помощью array_push?

Функция array_push($array, $value1, $value2, ...) принимает массив и один или несколько элементов. Она добавляет их в конец и возвращает новое количество элементов. Пример:


<?php
$colors = ['red', 'green'];
$newCount = array_push($colors, 'blue', 'yellow');
echo $newCount; // 4
// $colors: ['red', 'green', 'blue', 'yellow']
?>

Этот способ удобен при добавлении нескольких значений, но для одного элемента уступает прямому синтаксису по скорости.

Проблема: если массив ассоциативный (строковые ключи), array_push сбрасывает числовые ключи, начиная с 0. Например:


<?php
$user = ['name' => 'Ivan', 'age' => 25];
array_push($user, 'active');
// $user: ['name' => 'Ivan', 'age' => 25, 0 => 'active']
?>

Чтобы избежать потери ассоциативной природы, лучше применять $user[] = 'active';, который также создаёт числовой ключ, но не сбрасывает предыдущие.

Как добавить элемент в начало массива?

Функция array_unshift($array, $value1, $value2, ...) добавляет один или несколько элементов в начало, сдвигая существующие элементы вправо. Возвращает новое количество элементов. Пример:


<?php
$letters = ['b', 'c'];
array_unshift($letters, 'a');
// $letters: ['a', 'b', 'c']
?>

При добавлении нескольких элементов они помещаются в начало в том же порядке. Важно: числовые ключи переиндексируются, а строковые сохраняются, но порядок сдвигается.

Проблема: array_unshift изменяет все числовые ключи, что может нарушить ссылки на элементы. Для ассоциативных массивов лучше не использовать эту функцию, если порядок естественен.

Как добавить элемент с указанием ключа?

Прямое присваивание по ключу: $array[$key] = $value;. Если ключ уже существует, значение будет перезаписано; если нет - создаётся новая запись. Пример для ассоциативного массива:


<?php
$person = ['name' => 'Anna'];
$person['age'] = 30;
// $person: ['name' => 'Anna', 'age' => 30]
?>

Для числового массива можно задать конкретный ключ, но нужно следить, чтобы он не конфликтовал с существующими.

Ошибка: если ключ является логическим значением, оно будет преобразовано в целое число (true -> 1, false -> 0), что может быть неожиданным.

Как объединить два массива?

Для слияния применяется функция array_merge($array1, $array2, ...) или оператор +. Пример с array_merge:


<?php
$first = [1, 2];
$second = [3, 4];
$merged = array_merge($first, $second);
// $merged: [1, 2, 3, 4]
?>

При использовании оператора + объединение происходит с сохранением уникальности ключей: элементы с повторяющимися ключами не добавляются (остаётся первый). Пример:


<?php
$a = ['a' => 1, 'b' => 2];
$b = ['b' => 3, 'c' => 4];
$result = $a + $b;
// $result: ['a' => 1, 'b' => 2, 'c' => 4]
?>

Проблема: array_merge переиндексирует числовые ключи, из-за чего элементы с одинаковыми строковыми ключами перезаписываются (последним значением). Оператор +, наоборот, не перезаписывает существующие ключи, что может ввести в заблуждение. Всегда проверяйте ожидаемое поведение.

Как вставить элементы в произвольную позицию?

Функция array_splice($array, $offset, $length, $replacement) позволяет удалить или заменить часть массива, а также вставить новые элементы. Для вставки без удаления нужно указать $length = 0. Пример:


<?php
$list = ['a', 'b', 'e'];
array_splice($list, 2, 0, ['c', 'd']);
// $list: ['a', 'b', 'c', 'd', 'e']
?>

Отрицательный offset отсчитывается от конца массива. Функция возвращает удалённые элементы, но исходный массив изменяется по ссылке.

Ошибка: если $offset выходит за пределы массива, результат может быть непредсказуемым (элементы добавляются в конец или не добавляются). Следует проверять длину.

Дополнительные примеры с подробными пояснениями:

Пример

<?php
// 1. Добавление с помощью оператора spread (PHP 7.4+)
$base = [1, 2];
$new = [...$base, 3, 4];
// $new: [1, 2, 3, 4]
?>
Результат: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )

Оператор ... (spread) распаковывает массив внутри другого массива. Это удобно для создания нового массива с добавлением в начало или конец.

Пример

<?php
// 2. Добавление в многомерный массив
$matrix = ['rows' => [1, 2]];
$matrix['rows'][] = 3;
$matrix['cols'] = [4, 5];
// $matrix: ['rows' => [1,2,3], 'cols' => [4,5]]
?>
Результат: Array ( [rows] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [cols] => Array ( [0] => 4 [1] => 5 ) )

Добавление на глубоких уровнях не отличается от плоских массивов: используется цепочка ключей и [] для нового числового индекса.

Пример

<?php
// 3. Добавление элемента только если ключ не существует
$config = ['host' => 'localhost'];
if (!array_key_exists('port', $config)) {
    $config['port'] = 3306;
}
?>
Результат: Array ( [host] => localhost [port] => 3306 )

Проверка array_key_exists позволяет избежать случайной перезаписи.

Пример

<?php
// 4. Добавление с помощью array_push и получение нового размера
$stack = [1];
$size = array_push($stack, 2, 3);
echo $size; // 3
?>
Результат: 3

Функция возвращает количество элементов после добавления, что может быть полезно для контроля.

Пример

<?php
// 5. Вставка в середину с array_splice и заменой
$items = ['a', 'b', 'c'];
// Вставить 'X' перед 'c'
array_splice($items, 2, 0, 'X');
// $items: ['a', 'b', 'X', 'c']
?>
Результат: Array ( [0] => a [1] => b [2] => X [3] => c )

Вставка может быть несколько элементов, передав массив вторым аргументом replacement.

Пример

<?php
// 6. Добавление элементов из другого массива без переиндексации (сохранение строковых ключей)
$default = ['color' => 'red', 'size' => 'M'];
$userPref = ['color' => 'blue'];
$final = $userPref + $default; // userPref имеет приоритет
?>
Результат: Array ( [color] => blue [size] => M )

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

Пример

<?php
// 7. Добавление объекта в массив
$obj = new stdClass();
$obj->name = 'test';
$arr[] = $obj;
echo $arr[0]->name; // test
?>
Результат: test

Массивы могут хранить любые типы, включая объекты. Добавление происходит так же, как для простых значений.

Пример

<?php
// 8. Добавление по ссылке в пользовательской функции
function addItem(array &$arr, $item): void {
    $arr[] = $item;
}
$data = [1, 2];
addItem($data, 3);
// $data: [1, 2, 3]
?>
Результат: Array ( [0] => 1 [1] => 2 [2] => 3 )

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

Добавление в PHP - comments

En
Php добавить (php)