Ответ вслух Senior Массивы изнутри спрашивают часто обновлено

Массивы PHP изнутри

Вопрос

Расскажите, как устроены массивы в PHP и какие из этого следуют особенности.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Массив в PHP это упорядоченная хеш-таблица: элементы хранятся в порядке вставки в непрерывном массиве бакетов, а хеш-индекс позволяет находить их по ключу в среднем за O(1). Поэтому один тип служит и списком, и словарём, и foreach всегда идёт в порядке добавления.

Что должно прозвучать в ответе

  • Упорядоченная хеш-таблица, порядок вставки сохраняется

  • Packed-массивы для списков, хеш-режим для словарей

  • Ключи только int и string, приведение ключей

  • Семантика значения и copy-on-write при присваивании и передаче

  • Ссылки в foreach и необходимость unset

  • Для больших объёмов: генераторы, SplFixedArray, память на элемент

Что могут спросить следом

  • Почему array_shift медленный на больших массивах?
  • Сколько памяти занимает массив из миллиона int?

Разбор

Массив в PHP это упорядоченная хеш-таблица: элементы хранятся в порядке вставки в непрерывном массиве бакетов, а хеш-индекс позволяет находить их по ключу в среднем за O(1). Поэтому один тип служит и списком, и словарём, и foreach всегда идёт в порядке добавления. Если ключи идут подряд с нуля, движок использует packed-режим без хеш-индекса, это экономит память.

Ключами бывают только int и string, остальное приводится: строка "5" становится числом 5, true единицей, дробные числа обрезаются. Это источник неожиданных коллизий.

Массивы передаются по значению, но копируются лениво: пока никто не меняет данные, переменные делят одну структуру. Отдельная ловушка foreach по ссылке: после цикла переменная остаётся ссылкой на последний элемент, поэтому нужен unset. А для больших данных массивы прожорливы, каждый элемент это zval в бакете, поэтому миллион строк из файла лучше обрабатывать генератором.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.