Может ли кто-нибудь объяснить, как PHP реализует ассоциативные массивы? Какая базовая структура данных использует PHP? Является ли PHP хэш ключом и хранит его в каком-то хэш-карте? Мне любопытно, потому что мне было интересно, что такое производительность ассоциативных массивов, где при вставке и поиске ключей.
Это хэш-таблица. Объявление типа и функция хеширования находятся здесь:
http://svn.php.net/viewvc/php/php-src/trunk/Zend/zend_hash.h?view=markup
Существует легкий вес и связанный список в spl (стандартный php lib)
Ну, для чего это стоит, все массивы PHP являются ассоциативными массивами.
Наивысшая пропущенная ссылка ответа нарушена и не дает такого объяснения.
PHP написан на C, а базовая структура – это просто массив C. C – это просто куски памяти. Индексы в массивах C должны быть непрерывными, вы не можете иметь индекс 0 и индекс 1000, который следует за ним. Чтобы создать ассоциативные ключи массива, прежде чем они будут добавлены в массив C, они преобразуются в собственные индексы C с помощью хеш-функции.
Для полного объяснения я нашел эту ссылку более информативной.
http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html
@EBGreen верен.
Это дает вам некоторые интересные проблемы с производительностью, особенно при обработке массива в виде списка и использовании оператора [] (array add). PHP, похоже, не кэширует самый большой числовой ключ и не добавляет его к нему, вместо этого он, похоже, пересекает все ключи, чтобы найти, что должен делать следующий цифровой ключ. Я перезаписал скрипты на python из-за унылой производительности массива как списка.
Ассоциированные массивы имеют стандартные служебные данные dict / hash.
Это все хэш-таблицы, согласно источникам на различных веб-форумах: http://www.usenet-forums.com/php-language/15348-zend-engine-array-implementation.html
Если вы хотите быть уверенным, прочитайте исходный код, а затем скомпилируйте его, но убедитесь, что вы можете доверять своему компилятору (Warning: PDF и не связанный, но очень крутой).