24

PHP が連想配列を実装する方法を誰か説明できますか? PHP が使用する基礎となるデータ構造は何ですか? PHP はキーをハッシュして、ある種のハッシュ マップに格納しますか? キーを挿入して検索するときに、連想配列のパフォーマンスがどこにあるのか疑問に思っていたので、私は興味があります。

4

5 に答える 5

8

最も投票数の多い回答リンクは壊れており、それほど多くの説明はありません。

PHP は C で書かれており、基礎となる構造は単なる C 配列です。C 配列は単なるメモリの塊です。C 配列のインデックスは連続している必要があります。インデックス 0 とその後に続くインデックス 1000 を使用することはできません。連想配列キーを機能させるために、C 配列に追加される前に、ハッシュ関数を介して適切な C インデックスに変換されます。

完全な説明については、このリンクがより有益であることがわかりました。

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

于 2014-04-21T23:26:32.777 に答える
7

ハッシュテーブルです。型宣言とハッシュ関数はこちら:
http://svn.php.net/viewvc/php/php-src/trunk/Zend/zend_hash.h?view=markup

spl (標準の PHP ライブラリ) 内に軽量の配列とリンクされたリストがあります。

于 2010-04-22T18:54:11.857 に答える
6

まあ、それが価値があるのは、すべてのPHP配列が連想配列です。

于 2008-10-29T16:28:22.373 に答える
3

@EBGreenは正しいです。

これは、特に配列をリストとして扱い、[] (配列追加) 演算子を使用する場合に、いくつかの興味深いパフォーマンスの問題を引き起こします。PHP は、最大の数値キーをキャッシュしてそれに 1 つ追加するのではなく、すべてのキーをトラバースして、次の数値キーがどうあるべきかを見つけているようです。PHP のリストとしての配列のパフォーマンスが悪いため、Python でスクリプトを書き直しました。

連想配列には、標準の dict/hash パフォーマンス オーバーヘッドがあります。

于 2008-10-29T17:14:36.787 に答える
2

さまざまなWebフォーラムの情報源によると、これはすべてハッシュテーブルです: http ://www.usenet-forums.com/php-language/15348-zend-engine-array-implementation.html

確認したい場合は、ソースを読んでからコンパイルしますが、コンパイラを信頼できることを確認してください(警告:PDF、無関係ですが、非常にクールです)。

于 2008-10-29T16:52:05.693 に答える