Массивы в PHP: что нужно знать до первого рабочего кода
Массив в PHP — это не то, чем кажется программисту с опытом Java или C. Разбираем, как он устроен, какие функции нужны с первого дня и где новичок теряет данные.

За полчаса вы разберётесь, как устроен массив в PHP, почему он одновременно и список, и словарь, и какие 8-10 функций закрывают 90% повседневных задач. Речь про PHP 8.x — синтаксис короткого объявления [] и стрелочные функции работают начиная с 7.4, а именованные аргументы и деструктуризацию с ключами разберём в версии 8.1+.
Главная ловушка: тот, кто пришёл из Java, C# или C, ждёт, что массив — это индексированный набор одного типа. В PHP это не так, и первые же баги возникают именно из-за этого ожидания.
Что нужно иметь до начала
- PHP 8.0 или новее. Проверьте командой
php -v. На 7.4 почти всё из статьи работает, но примеры я привожу для 8.x. - Любой редактор и возможность запускать
php script.phpв терминале либо встроенный серверphp -S localhost:8000. - Понимание, что такое переменная и цикл. Синтаксис классов здесь не нужен.
Массив в PHP — это упорядоченная карта
В официальной документации массив назван ordered map — упорядоченное отображение ключей на значения. Одна структура данных играет роль списка, словаря, стека, очереди и коллекции одновременно. Отдельного типа «список» в языке нет.
Ключом может быть целое число или строка. Значением — что угодно, включая другой массив. Смешивать типы значений в одном массиве язык позволяет, хотя злоупотреблять этим не стоит.
<?php
// Список: ключи проставляются автоматически 0, 1, 2
$fruits = ['яблоко', 'груша', 'слива'];
// Ассоциативный массив: ключи задаёте вы
$user = [
'name' => 'Ирина',
'age' => 34,
'admin' => false,
];
// Вложенность — обычное дело
$order = [
'id' => 1024,
'items' => ['яблоко', 'груша'],
];
Обратиться к элементу можно по ключу: $user['name']. Обращение к несуществующему ключу в PHP 8 выдаёт Warning: Undefined array key и возвращает null — раньше это был Notice. Это уже не тихая ошибка, которую легко проглядеть.
Ключи ведут себя неочевидно
Строковый ключ, который выглядит как целое число ('7'), приводится к числу 7. Ключи true и false превращаются в 1 и 0. Ключ null становится пустой строкой. Дробные числа отбрасывают дробную часть. Из-за этого можно случайно перезаписать элемент, думая, что добавляете новый.
Если функция вернула вам массив с ключами 0, 1, 2 — это ещё не значит, что она вернула список. Послеunset($arr[1])ключи станут 0 и 2, и циклfor ($i = 0; $i < count($arr); $i++)тихо пропустит данные. Для перебора беритеforeach.
Перебор: foreach вместо for
Именно здесь ломается большинство новичков с бэкграундом в других языках. Из-за произвольных ключей for по индексу небезопасен. Универсальный инструмент — foreach.
<?php
$user = ['name' => 'Ирина', 'age' => 34];
// Только значения
foreach ($user as $value) {
echo $value . PHP_EOL;
}
// Ключ и значение
foreach ($user as $key => $value) {
echo "$key: $value" . PHP_EOL;
}
Отдельная мина — foreach ($arr as &$value) с ссылкой. После цикла переменная $value остаётся ссылкой на последний элемент. Следующий цикл по той же переменной перезапишет данные. Правило: сразу после такого цикла делайте unset($value).
Функции, которые нужны с первого дня
Их в языке больше сотни, но начать стоит с этого набора. Обратите внимание на порядок аргументов — он в PHP исторически непоследователен, и это источник ошибок.
| Функция | Что делает | Что вернёт |
|---|---|---|
count($arr) | Число элементов | int |
in_array($v, $arr) | Есть ли значение | bool |
array_key_exists($k, $arr) | Есть ли ключ | bool |
array_keys($arr) | Все ключи | array |
array_values($arr) | Все значения с переиндексацией | array |
array_map($fn, $arr) | Преобразовать каждый элемент | array |
array_filter($arr, $fn) | Отобрать по условию | array |
array_merge($a, $b) | Объединить массивы | array |
implode($sep, $arr) | Склеить в строку | string |
Заметьте: у array_map функция идёт первым аргументом, а у array_filter — вторым. Это не опечатка в таблице, а реальная непоследовательность языка. Держите документацию под рукой.
<?php
$prices = [100, 250, 90, 400];
// Оставить дороже 100 и накинуть 20%
$expensive = array_filter($prices, fn($p) => $p > 100);
$withTax = array_map(fn($p) => $p * 1.2, $expensive);
// array_filter сохраняет исходные ключи!
print_r($withTax);
// Ключи будут 1 и 3, а не 0 и 1
Проверка на существование ключа
Разница между isset() и array_key_exists() сбивает новичков. isset($arr['k']) вернёт false, если ключ существует, но его значение равно null. array_key_exists('k', $arr) в том же случае вернёт true. Если вам важно отличить «ключа нет» от «значение null» — берите вторую.
Слияние: + и array_merge ведут себя по-разному
Ещё одна частая ошибка. Оператор + и функция array_merge() объединяют массивы не одинаково:
array_merge($a, $b)— для строковых ключей значения из$bперезаписывают$a; числовые ключи переиндексируются заново.$a + $b— берёт из$a, а из$bдобавляет только те ключи, которых в$aещё нет. Ничего не переиндексирует.
Для ассоциативных массивов с настройками часто нужен именно + (значения по умолчанию), а не array_merge.
Если не получилось
- Warning: Undefined array key "..." — обращаетесь к несуществующему ключу. Проверяйте через
isset()или используйте??:$user['phone'] ?? 'не указан'. - Warning: foreach() argument must be of type array|object, null given — в
foreachпопалnull, а не массив. Часто функция вернулаfalseилиnullвместо массива. Проверьте, что вернул источник данных. - Array to string conversion — пытаетесь вывести массив через
echo. Для отладки используйтеprint_r($arr)илиvar_dump($arr), для склейки —implode(). - Данные «теряются» после unset — вы перебираете по числовому индексу через
for. Замените наforeachили переиндексируйте черезarray_values(). - Последний элемент дублируется — забыли
unset($value)послеforeachсо ссылкой&$value.
Что делать дальше
Когда базовый набор функций перестанет быть загадкой, посмотрите на array_reduce для свёртки, usort/uasort для сортировки с пользовательской функцией и на разницу между сортировками, сохраняющими ключи (asort) и нет (sort). Отдельная большая тема — производительность массивов на больших объёмах и переход на генераторы (yield), когда данные не помещаются в память; здесь мы её только обозначаем. Полный список функций держите открытым в документации: их порядок аргументов запомнить сходу невозможно, и это нормально.
Логотип и фирменный стиль: Три концепции разного характера, палитра с обоснованием, проверка на читаемость в малом размере и в один цвет.
Спросить за 60 ₽Источники: PHP Manual: Arrays, PHP Manual: Функции для работы с массивами
Частые вопросы
Чем массив в PHP отличается от массива в C или Java?
Что использовать для проверки — isset или array_key_exists?
У меня PHP 7.4, примеры сработают?
Почему после array_filter у меня странные ключи?
Как безопасно вывести содержимое массива для отладки?
Почему последний элемент массива иногда дублируется после цикла?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.