Как ассоциативные массивы реализованы в PHP?

Может кто-нибудь объяснить, как PHP реализует ассоциативные массивы? Какую базовую структуру данных использует PHP? Хеширует ли PHP ключ и хранит ли его в какой-то хэш-карте? Мне любопытно, потому что мне было интересно, какова производительность ассоциативных массивов при вставке и поиске ключей.

Я оставлю эту ссылку, чтобы кто-нибудь еще мог ее изучить, но вы можете просмотреть фактический исходный код C для PHP на http://svn.php.net/viewvc/php/php-src/

Kyle Hale 29.10.2008 19:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
24
1
8 702
5

Ответы 5

Ну, как бы то ни было, массивы все PHP являются ассоциативными массивами.

Согласно источникам на различных форумах, это все хеш-таблицы: http://www.usenet-forums.com/php-language/15348-zend-engine-array-implementation.html

Если вы хотите быть уверенным, прочтите исходный код, затем скомпилируйте его, но убедитесь, что вы можете доверяй своему компилятору (Предупреждение: PDF и не связанные, но очень крутые).

@EBGreen правильный.

Это дает вам некоторые интересные проблемы с производительностью, особенно когда массив рассматривается как список и используется оператор [] (добавление массива). Кажется, что PHP не кэширует самый большой числовой ключ и не добавляет к нему единицу, вместо этого он, кажется, просматривает все ключи, чтобы найти, каким должен быть следующий числовой ключ. Я переписал скрипты на Python из-за унылой производительности PHP в виде массива в виде списка.

У ассоциативных массивов есть стандартные накладные расходы на производительность dict / hash.

Ты уверен насчет этого? Я только что провел тесты на тестовом массиве из 1000 записей (копирование в новый массив, одну за другой), и если вы не укажете ключ для нового массива, он будет последовательно на 7% быстрее (на PHP 5.2.6 )

JamShady 30.10.2008 00:08

Возможно, они его недавно изменили. Я использовал 5.1, когда делал работу. Массив PHP был УЖАСНЫМ, когда вы говорите о 10К или более записях.

jcoby 30.10.2008 00:46

AFAIK это не так, сравните: В хеш-таблице zend есть элемент nNextFreeElement ...

hakre 03.10.2011 13:22

@RickyMason. Вероятно, вы бы этого не сделали, но для тщательного тестирования вычисление времени для каждого элемента для 10, 100, 1k и 10k действительно выявило бы проблемы с производительностью масштабируемости, особенно если есть вероятность, что 10k, возможно, придется обработать.

Patanjali 27.08.2016 14:13

Это хеш-таблица. Объявление типа и функция хеширования находятся здесь:
http://svn.php.net/viewvc/php/php-src/trunk/Zend/zend_hash.h?view=markup

В spl (стандартная библиотека php) есть облегченный массив и связанный список.

Источник перемещен на GitHub: github.com/php/php-src/blob/master/Zend/zend_hash.h

David 16.06.2016 03:32

Ссылка на ответ, получившая наибольшее количество голосов, не работает и не дает подробного объяснения.

PHP написан на C, а основная структура - это просто массив C. Массивы C - это просто фрагменты памяти. Индексы в массивах C должны быть непрерывными, у вас не может быть индекса 0 и индекса 1000, который идет после него. Чтобы ключи ассоциативного массива работали, перед их добавлением в массив C они преобразуются в соответствующие индексы C с помощью хэш-функции.

Для полного объяснения я нашел эту ссылку гораздо более информативной.

http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html

Другие вопросы по теме