Добавление значений в массивы: от простого к сложному
Основные способы добавления элементов в массивы
Наиболее эффективное решение для добавления одного элемента в конец массива: прямой синтаксис $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 )
Передача массива по ссылке позволяет модифицировать исходный массив внутри функции без возврата значения.