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