В чем отличие массивов в PHP от массивов в других языках
Что проверяют
Понимаете ли вы, что array в PHP не массив в смысле C или Java, и какие последствия это имеет для памяти и поведения. Следом обычно спрашивают, передаётся ли массив по ссылке и чем array_merge отличается от оператора +.
Как отвечать
Главный тезис: PHP-массив это упорядоченная хеш-таблица, один тип сразу для списка, словаря, стека и очереди.
- ключи: только
intилиstring. Строка"8"становится целым 8, а"08"остаётся строкой,trueпревращается в 1,nullв пустую строку. Дробный ключ обрезается до целого, и с PHP 8.1 это вызывает deprecation; - порядок: элементы идут в порядке вставки, а не по ключам. Отличить список от словаря помогает
array_is_list()из PHP 8.1, и от этого же зависит, что вернётjson_encode:[...]или{...}; - семантика значения: массив передаётся и присваивается по значению, но реально копируется только при записи (copy-on-write). Объекты же передаются как дескриптор, и на этом часто путаются;
- память: с PHP 7 плотные массивы с ключами от 0 подряд хранятся в «упакованном» виде, но даже так массив из миллиона целых занимает в несколько раз больше памяти, чем
int[]в C или Java. Для фиксированного набора с целыми индексами естьSplFixedArray.
Для сравнения: в Java int[] имеет фиксированный размер и один тип элементов, а список и словарь это разные классы, ArrayList и HashMap. В Python то же разделение на list и dict, словарь хранит порядок вставки с версии 3.7. В JavaScript массив это объект со специальным свойством length.
Где спотыкаются
Говорят, что в других языках нет строковых ключей. Есть, просто это отдельный тип: HashMap, Dictionary, dict. Отличие PHP в том, что всё это один тип.
Путают array_merge и +. Первый перенумеровывает целые ключи, а при совпадении строковых берёт значение из правого массива. Второй сохраняет всё из левого и добавляет справа только ключи, которых слева нет.
Используют foreach ($arr as &$v) и не делают unset($v) после цикла. Ссылка остаётся на последнем элементе, и следующий foreach с той же переменной тихо портит данные.