Как ассоциативные массивы реализованы в PHP? - PullRequest
23 голосов
/ 29 октября 2008

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

Ответы [ 5 ]

7 голосов
/ 22 апреля 2010

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

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

6 голосов
/ 22 апреля 2014

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

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

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

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

6 голосов
/ 29 октября 2008

Ну, для чего это стоит, все Массивы PHP - это ассоциативные массивы.

3 голосов
/ 29 октября 2008

@ EBGreen правильно.

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

Ассоциативные массивы имеют стандартные накладные расходы на обработку в формате dict / hash.

2 голосов
/ 29 октября 2008

Это все хеш-таблицы, согласно источникам на различных веб-форумах: http://www.usenet -forums.com / PHP язык / 15348-Зенд-двигатель-массив implementation.html

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

...