26 Stimmen

Wie sind assoziative Arrays in PHP implementiert?

Kann jemand erklären, wie PHP assoziative Arrays implementiert? Welche zugrunde liegende Datenstruktur verwendet PHP? Verschlüsselt PHP den Schlüssel und speichert ihn in einer Art Hash-Map? Ich bin neugierig, weil ich mich frage, wie die Leistung von assoziativen Arrays beim Einfügen und Suchen von Schlüsseln ist.

1 Stimmen

Ich überlasse diesen Link jemand anderem zum Durchforsten, aber Sie können den eigentlichen C-Quelltext für PHP unter http://svn.php.net/viewvc/php/php-src/

8voto

PressingOnAlways Punkte 10654

Der Link zu der am höchsten bewerteten Antwort ist defekt und bietet nicht viel Erklärung.

PHP ist in C geschrieben und die zugrunde liegende Struktur ist einfach ein C-Array. C-Arrays sind einfach nur Speicherblöcke. Die Indizes in C-Arrays müssen fortlaufend sein, man kann nicht einen Index 0 und einen Index 1000 haben, der danach kommt. Damit assoziative Array-Schlüssel funktionieren, werden sie, bevor sie dem C-Array hinzugefügt werden, über eine Hash-Funktion in richtige C-Indizes umgewandelt.

Für eine ausführliche Erklärung fand ich diesen Link sehr viel informativer.

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

0 Stimmen

Wie groß ist das zugrunde liegende C-Array? Wird die Größe erhöht und werden die Schlüssel neu aufbereitet, wenn das Array über die Zeit wächst, wie z.B. in Javas HashMap ? Ich danke Ihnen!

0 Stimmen

@tonix Sie können sich den Quellcode selbst ansehen - github.com/php/php-src/blob/master/Zend/zend_hash.c . Früher wurden nur HashTable Datentyp in php5, aber alles ist jetzt zen engine, also benutzen sie zend_hash, das immer noch hashtables benutzt. Sie können mehr darüber lesen unter: phpinternalsbook.com/php5/hashtables.html

1 Stimmen

@tonix Kurz gesagt, ja. Wie bei den meisten Hash-Tabellen gilt: Wenn ein eingefügtes Element die Auslastung des Containers über den von der Implementierung festgelegten Schwellenwert hinaus erhöht, weist die Tabelle Speicher für ein größeres Array zu und ordnet die Schlüssel neu an.

7voto

chuck Punkte 71

Es ist eine Hashtabelle. Die Typdeklaration und die Hash-Funktion befinden sich hier:
http://svn.php.net/viewvc/php/php-src/trunk/Zend/zend_hash.h?view=markup

Es gibt ein leichtgewichtiges Array und eine verknüpfte Liste innerhalb der spl (Standard-PHP-Lib)

0 Stimmen

Der Quelltext wurde nach GitHub verschoben: github.com/php/php-src/blob/master/Zend/zend_hash.h

6voto

EBGreen Punkte 35149

Nun, was auch immer es wert ist, todo PHP-Arrays sind assoziative Arrays.

3voto

jcoby Punkte 4150

@EBGreen ist richtig.

Dies führt zu einigen interessanten Leistungsproblemen, insbesondere wenn ein Array als Liste behandelt und der Operator [] (Array add) verwendet wird. PHP scheint nicht den größten numerischen Schlüssel zwischenzuspeichern und ihm einen hinzuzufügen, sondern alle Schlüssel zu durchlaufen, um den nächsten numerischen Schlüssel zu finden. Ich habe Skripte in Python umgeschrieben, weil PHPs Array-as-a-List-Leistung so schlecht ist.

Assoziative Arrays haben den üblichen Diktat-/Hash-Leistungs-Overhead.

3 Stimmen

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

0 Stimmen

Es ist möglich, dass sie es kürzlich geändert haben. Ich habe 5.1 benutzt, als ich die Arbeit gemacht habe. Das Array von PHP war SCHLECHT, wenn es um 10k Einträge oder mehr geht.

2 Stimmen

AFAIK ist dies nicht der Fall, bitte vergleichen Sie: Eine zend-Hashtabelle hat ein Element nNextFreeElement ...

2voto

jakber Punkte 3469

Es handelt sich um Hash-Tabellen, wie in verschiedenen Webforen zu lesen ist: http://www.usenet-forums.com/php-language/15348-zend-engine-array-implementation.html

Wenn Sie sicher sein wollen, lesen Sie den Quelltext und kompilieren Sie ihn, aber stellen Sie sicher, dass Sie die Vertrauen Sie Ihrem Compiler (Warnung: PDF, und nicht verwandt, aber sehr cool).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X