2008-10-29 14 views
23

Kann jemand erklären, wie PHP assoziative Arrays implementiert? Welche zugrunde liegende Datenstruktur verwendet PHP? Hasht PHP den Schlüssel und speichert ihn in einer Art Hash-Map? Ich bin neugierig, weil ich mich gefragt habe, welche Leistung assoziative Arrays beim Einfügen und Suchen von Schlüsseln haben.Wie sind assoziative Arrays in PHP implementiert?

+0

Ich werde diesen Link für jemanden verlassen sonst durch schleifen, aber Sie können die tatsächlichen C-Quelle für PHP an [http://svn.php.net/viewvc/php/php-src ansehen /](http://svn.php.net/viewvc/php/php-src/) –

Antwort

6

Nun, für das, was es wert ist, alle PHP-Arrays sind assoziative Arrays.

3

@EBGreen ist korrekt.

Das gibt Ihnen einige interessante Leistungsprobleme, besonders wenn Sie ein Array als eine Liste behandeln und den Operator [] (Array hinzufügen) verwenden. PHP scheint den größten numerischen Schlüssel nicht zu cachen und fügt einen hinzu, stattdessen scheint er alle Schlüssel zu durchlaufen, um zu finden, was der nächste numerische Schlüssel sein soll. Ich habe Skripte in Python umgeschrieben, weil PHP eine düstere Array-as-a-List-Performance hat.

Assoziative Arrays haben den Standard-Dict/Hash-Performance-Overhead.

+3

Sind Sie sich sicher? Ich habe gerade Benchmarks auf einem Test-Array von 1000 Einträgen ausgeführt (Kopieren in ein neues Array, eins nach dem anderen), und wenn Sie den Schlüssel für das neue Array nicht angeben, ist es konsistent 7% schneller (auf PHP 5.2.6) – JamShady

+0

Es ist möglich, dass sie es kürzlich geändert haben. Ich habe 5.1 benutzt, als ich die Arbeit gemacht habe. PHP-Array war AWUL, wenn Sie über 10k Einträge oder mehr sprechen. – jcoby

+2

AFAIK das ist nicht der Fall, bitte vergleichen: [Eine Zend Hash Tabelle hat ein Element 'nNextFreeElement' ...] (http://stackoverflow.com/questions/3698743/how-to-find-the-next-numeric) -Index-eines-bestehenden-Array/3698786 # 3698786) – hakre

4

Die höchste gestimmt Antwort Link gebrochen ist und nicht geben So viel Erklärung.

PHP ist in C geschrieben und die zugrunde liegende Struktur ist nur ein C-Array. C-Arrays sind nur Teile des Speichers. Die Indizes in C-Arrays müssen fortlaufend sein. Sie können keinen Index 0 und einen Index 1000 haben, der danach kommt. Damit assoziative Array-Schlüssel funktionieren, bevor sie dem C-Array hinzugefügt werden, werden sie über eine Hash-Funktion in geeignete C-Indizes konvertiert.

Für eine vollständige Erklärung, fand ich diesen Link viel informativer.

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