Массивы PHP изнутри
Вопрос
Расскажите, как устроены массивы в PHP и какие из этого следуют особенности.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Упорядоченная хеш-таблица, порядок вставки сохраняется
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 ошибок.