Heim  >  Artikel  >  Backend-Entwicklung  >  Eine ausführliche Analyse, wie PHP-Arrays mehrere Datentypen flexibel unterstützen

Eine ausführliche Analyse, wie PHP-Arrays mehrere Datentypen flexibel unterstützen

藏色散人
藏色散人nach vorne
2023-03-25 15:31:441492Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über PHP. Er stellt vor allem vor, wie Arrays mehrere Datentypen flexibel unterstützen können. Ich hoffe, dass er Ihnen weiterhilft.

Eine ausführliche Analyse, wie PHP-Arrays mehrere Datentypen flexibel unterstützen

In PHP wird die Anwendungsverarbeitung von Array-Datenstrukturen sehr häufig verwendet. Im Vergleich zu stark typisierten Sprachen wie Java und C++ sind Arrays von PHP einfach zu einfach zu verwenden und können verschiedene Arten von Daten speichern Datentypen (z. B. Zahlen, Zeichenfolgen und sogar Objekte usw.) sorgen für großen Komfort bei der Entwicklung.

Basierend auf den leistungsstarken Funktionen von PHP-Arrays können wir problemlos komplexere Datenstrukturen wie Stapel, Warteschlangen, Listen, Mengen, Wörterbücher usw. implementieren.

Eine ausführliche Analyse, wie PHP-Arrays mehrere Datentypen flexibel unterstützen

Sind Sie gespannt darauf, herauszufinden: Wie implementiert PHP Arrays?

1. Die zugrunde liegende Datenstruktur des PHP-Arrays

PHP-Array wird intern mithilfe der HashTable-Struktur implementiert. Lassen Sie uns also zuerst kurz über HashTable sprechen!

HashTable, auch Hash-Tabelle genannt, ist eine Struktur, die über Schlüsselwerte effizient auf Daten zugreift. Eine Hash-Tabelle ist eine Kombination aus einem Array und einer verknüpften Liste und integriert die schnelle Adressierung eines Arrays und das schnelle Einfügen einer verknüpften Liste.

Eine ausführliche Analyse, wie PHP-Arrays mehrere Datentypen flexibel unterstützen

HashTable ist hauptsächlich in zwei Links unterteilt:

1. Hash-Funktion: Die Hash-Funktion wandelt den zu findenden Wert in einen numerischen Index um, und der numerische Index kann die Position des Werts schnell finden.

2. Hash-Kollision: Im Idealfall sind die Ergebnisse unterschiedlich, wenn unterschiedliche Werte nach dem Hashing dieselbe Zahl ergeben.

Wenn Sie HashTable anwenden, müssen Sie sich dem Problem der Hash-Kollision stellen. Es gibt zwei Hauptlösungen: die Methode der verknüpften Liste und die Methode der offenen Adressierung.

In der Datei zend_type.h finden Sie die Hauptstrukturdefinition von HashTable wie folgt:

zend_array-Typ

Wählen Sie einige wichtige Elemente zur Einführung aus:

  • gc: Referenzzählung, Verwendung der Garbage Collection .

  • arData: Das Array, das die Speicherelemente in der Hash-Tabelle speichert, sein Speicher ist kontinuierlich, arData zeigt auf die Startposition des Arrays;

  • nTableSize: Die Gesamtkapazität des Arrays, d. h Die Anzahl der Elemente, die untergebracht werden können, ist der Speicher von arData. Die Größe wird basierend auf diesem Wert bestimmt. Seine Größe ist die Potenz von 2, mit einem Minimum von 8, und erhöht sich dann nacheinander entsprechend 8, 16, 32 .... ;

Eine ausführliche Analyse, wie PHP-Arrays mehrere Datentypen flexibel unterstützen

Bucket-Typ

Bucket Die Struktur ist relativ einfach und wird hauptsächlich zum Speichern des Schlüssels und Werts des Elements sowie einer Ganzzahl h (Hash-Wert oder Hash-Wert) verwendet.

  • Wenn das Element ein numerischer Index ist, ist sein Wert der Wert des numerischen Index.

  • Wenn es ein String-Index ist, ist sein Wert der Hash-Wert des Schlüssels, der durch den Time33-Algorithmus berechnet wird. Der Wert von

h wird verwendet, um letztendlich den Speicherort des Elements abzubilden.

2. Grundlegende Implementierung des PHP-Arrays

Im obigen Teil haben wir etwas über die Datenstruktur von zend_array gelernt. Schauen wir uns dann die Initialisierung des Arrays an:

Die Initialisierung des Arrays ist Hauptsächlich für die Einstellung von HashTable-Mitgliedern wird der Speicher von arData nicht sofort während der Initialisierung zugewiesen. Der Speicher von arData wird nach dem Einfügen des ersten Elements zugewiesen.

Um die gesamte Hash-Struktur besser zu verstehen, geben wir ein Beispiel zur Veranschaulichung dieser Struktur:

$data = array(
    'hello' => 'haha',
    1       => 'me to'
    'world' => 'world', 
    2       => 2
);
unset($data[1]);

Wie sollte die obige Hash-Struktur aussehen? Wie sollte das von arData gespeicherte Ergebnis aussehen?

Zeichnen wir eine Abbildung, um es zu sehen, es ist intuitiver:

arData ist ein Zeiger vom Typ Bucket, der zum spezifischen Speichern des Schlüssels und Werts jedes Elements verwendet wird. Die Daten werden in der Reihenfolge gespeichert, in der sich die Elemente befinden eingefügt, also das Array Die Reihenfolge ist dadurch auch gewährleistet.

Wie Sie auf dem Bild sehen können, ist bei jedem Element des arData-Arrays die negative Zahl auf der linken Seite der Modulo-Hash-Wert, und der Index der arData auf der rechten Seite wird gespeichert Das Kopfelement der verknüpften Liste wird gespeichert.

arData[0]: key='hello', h=xx (ein bestimmter Wert), val = 'haha'

arData[1]: val ist der zval von type=IS_UNDEF (nicht unmittelbar nach dem Deaktivieren) wurde gelöscht und stattdessen auf IS_UNDEF gesetzt)

arData[2]: key='world', h=xx (ein bestimmter Wert), val = 'world'

arData[3]: key=NULL, h=2 (Hash-Wert-Konflikt kann auftreten), val = 2

….

Das obige Beispiel erklärt die Bedeutung von nNumUsed, nNumOfElements, arData im Detail.

3. Die Ordnung von PHP-Arrays

Die Reihenfolge jedes Elements im Array stimmt mit der Reihenfolge der Einfügung überein.

Um die Ordnung von PHP-Arrays zu erreichen, fügt die zugrunde liegende Hash-Tabelle von PHP eine Zuordnungstabelle zwischen der Hash-Funktion und dem Element-Array hinzu. Diese Zuordnungstabelle ist ebenfalls ein Array mit derselben Größe wie das Array, in dem die Elemente gespeichert sind Der Typ ist eine Ganzzahl, die zum Speichern des Index des Elements im tatsächlich gespeicherten geordneten Array verwendet wird. Die Elemente werden der Reihe nach in das tatsächlich gespeicherte Array eingefügt, und dann wird der Array-Index entsprechend der gehashten Position an der neuen Position gespeichert durch die Hash-Funktion:

Auf diese Weise kann die Ordnung der endgültig gespeicherten Daten vervollständigt werden.

Diese Zwischenzuordnungstabelle wird in der zugrunde liegenden Struktur des PHP-Arrays nicht explizit identifiziert, sondern zusammen mit arData platziert. Bei der Initialisierung des Arrays wird nicht nur der zum Speichern des Buckets verwendete Speicher zugewiesen, sondern auch die gleiche Anzahl Die Größe von uint32_t wird zugewiesen. Diese beiden Leerzeichen werden zusammen zugewiesen, und dann wird arData zum Speicherort des Elementarrays versetzt, und auf diese Zwischenzuordnungstabelle kann über arData vorwärts zugegriffen werden.

Zusammenfassung

Das Merkmal von Arrays in PHP besteht darin, dass sie Werte dem Schlüsseltyp zuordnen. Im Gegensatz zu anderen Sprachen können die Schlüssel von Arrays in PHP Zeichenfolgen sein und die Werte können von beliebigem Typ sein.

Zusätzlich zu den regulären Hinzufügungen, Löschungen, Änderungen und Prüfungen verfügen Arrays auch über viele andere Vorgänge wie Kopieren, Zusammenführen, Zerstören, Zurücksetzen usw. Die diesen Vorgängen entsprechenden Codes finden sich in zend_hash.c Erfahren Sie mehr darüber.

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonEine ausführliche Analyse, wie PHP-Arrays mehrere Datentypen flexibel unterstützen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.im. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen