PHP が連想配列を実装する方法を誰か説明できますか? PHP が使用する基礎となるデータ構造は何ですか? PHP はキーをハッシュして、ある種のハッシュ マップに格納しますか? キーを挿入して検索するときに、連想配列のパフォーマンスがどこにあるのか疑問に思っていたので、私は興味があります。
5 に答える
最も投票数の多い回答リンクは壊れており、それほど多くの説明はありません。
PHP は C で書かれており、基礎となる構造は単なる C 配列です。C 配列は単なるメモリの塊です。C 配列のインデックスは連続している必要があります。インデックス 0 とその後に続くインデックス 1000 を使用することはできません。連想配列キーを機能させるために、C 配列に追加される前に、ハッシュ関数を介して適切な C インデックスに変換されます。
完全な説明については、このリンクがより有益であることがわかりました。
http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html
ハッシュテーブルです。型宣言とハッシュ関数はこちら:
http://svn.php.net/viewvc/php/php-src/trunk/Zend/zend_hash.h?view=markup
spl (標準の PHP ライブラリ) 内に軽量の配列とリンクされたリストがあります。
まあ、それが価値があるのは、すべてのPHP配列が連想配列です。
@EBGreenは正しいです。
これは、特に配列をリストとして扱い、[] (配列追加) 演算子を使用する場合に、いくつかの興味深いパフォーマンスの問題を引き起こします。PHP は、最大の数値キーをキャッシュしてそれに 1 つ追加するのではなく、すべてのキーをトラバースして、次の数値キーがどうあるべきかを見つけているようです。PHP のリストとしての配列のパフォーマンスが悪いため、Python でスクリプトを書き直しました。
連想配列には、標準の dict/hash パフォーマンス オーバーヘッドがあります。
さまざまなWebフォーラムの情報源によると、これはすべてハッシュテーブルです: http ://www.usenet-forums.com/php-language/15348-zend-engine-array-implementation.html
確認したい場合は、ソースを読んでからコンパイルしますが、コンパイラを信頼できることを確認してください(警告:PDF、無関係ですが、非常にクールです)。