PHP: Ассоциативные массивы
2026-02-26 17:25 Diff

В PHP есть только один тип данных для массивов — Array. Его уникальность состоит в том, что с одной стороны он работает как обычный массив, а с другой — как ассоциативный. Зависит от того, как его используют.

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

Самый простой пример — JSON. В JSON массив и ассоциативный массив — разные сущности:

Ассоциативный массив

Массив

Если преобразовать JSON в структуру на PHP, то эта информация теряется:

Если мы не знаем структуру JSON, то у нас нет простого способа понять, что перед нами — массив или ассоциативный массив. В интернете с подобным сталкиваются постоянно и предлагают такой способ, как анализ ключей. Если они все числовые, то считаем, что массив, иначе — ассоциативный массив.

Конвертация из массива в JSON сопряжена с такими же проблемами. Как понять, во что конвертировать переданный массив?

Другая проблема заключается в том, что достаточно легко ошибиться с типом массива и начать его использовать не по назначению:

Первое удивление — код работает! Теперь попробуйте догадаться, что находится внутри $data.

Из этого вывода должно быть понятно, что индексированных массивов в PHP нет. Есть упорядоченные ассоциативные массивы, с операцией [] =: добавить элемент с автоматическим присвоением ключа.

Но самое неудобное — функции которые могут сохранять, а могут не сохранять ключи. Обычно в таких функциях есть дополнительный параметр флаг preserve_keys, который меняет описанное поведение.

  • array_reverse

    array_reverse(array $array, bool $preserve_keys = false): array

    Если preserve_keys установлен в TRUE, то числовые ключи будут сохранены. Нечисловые ключи не подвержены этой опции и всегда сохраняются.

  • array_unique

    array_unique(array $array, int $flags = SORT_STRING): array

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

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