Hallo Tom,
PHP weiss, wieviele Elemente der Array erhaelt. Der Rest ist rechnen:
Anzahl_Elemente * sizeof(element_pointer). Aber das steht auch wieder in dem Stueck Code,
was ich dir gepostet hab.
Das ist gelinde gesagt gelogen.
Ach? Dann zeige mir doch bitte das Gegenteil. Siehst du, wieder dasselbe, was ich dir
vorhin schon vorwarf: anstatt Argumente zu bringen sagst du nur “du hast Unrecht, ich habe
Recht”. Ich habe dir mit Hilfe des Code-Stuecks _gezeigt_, dass es so ist:
arTmp = (Bucket **) pemalloc(ht->nNumOfElements * sizeof(Bucket *), ht->persistent);
nNumOfElements ist sogar ein selbstbeschreibender Name. Was daran jetzt gelogen sein soll,
ist mir schleierhaft. Es ist so und basta.
PHP-Arrays haben keine Typvorschrift.
Ja, eh, und? Was hat das eine mit dem anderen zu tun?
Ob ich da nun einen Integer oder einen BLOB drauf lege, ist in der PHP-Schicht egal
Du redest wirr. Ich habe langsam wirklich keine Lust mehr, mich mit dir zu unterhalten.
Auf Script-Ebene arbeitet PHP statt mit ein Arrays mit Hashtables. Eine Hash-Tabelle ist
mit Hilfe einer Hash-Funktion und einer Tabellen-Struktur realisiert: aus dem Schluessel
wird eine Hash-Summe berechnet. Diese Hash-Summe bestimmt dann die Position des Elementes
in der Tabelle.
Diese Tabelle ist also statisch und ein echtes Array im Speicher?
Nein, es ist dynamisch. Statisch hiesse, es liegt auf dem Stack und die Groesse kann sich
nicht aendern. Haettest du die Quellen gelesen, die ich dir genannt habe, haettest du
erfahren, dass sich die Groesse einer Hash-Tabelle durchaus aendern kann, je nach
Fuellungsgrad.
Alle Elemente sind gleich groß?
Da sie lediglich Pointer sind: ja.
Der Zugriff auf jedes Element ist im direct random acces möglich?
Das schrieb ich dir doch.
Durch diese Hash-Summe kann also direkt auf das Element zugegriffen werden.
Diese "Summe" lässt sich also für jedes Element von Prozessor berechnen und muss nicht
nachgeschaut werden?
Wie, nachgeschaut? Tom, hast du eigentlich gelesen, was ich dir gepostet habe?
Also beginnt Element 23 (bei 1 angefangen zu zählen) bei [Arraystart].[22*Elementgröße]
Eine Hash-Tabelle ist _kein_ Array. Eine Hash-Tabelle ist eine Tabelle. Beispiel:
------------------
| Index | value |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| . | |
| . | |
| . | |
| 20 | |
| 21 | |
| 22 | |
| 23 | |
| 24 | |
------------------
In dieser Tabelle soll nun ein Wert mit dem Schluessen 203 gespeichert werden. Angenommen,
die Hash-Funktion arbeitet ganz einfach indem sie Halb-Byte-Weise eine Summe bildet (rein
hypothetisch, in Wirklichkeit sind die Funktionen viel komplexer). 203 wird bei 16 Bit
intern so dargestellt:
00000000 11001011
Die Halb-Byteweise Summe Waere also 0000 + 0000 + 1100 + 1011 = 10111
10111 ist dezimal 23. Daraus laesst sich also schliessen: der Wert mit dem Key 203 wird an
Index 23 gespeichert. Also saehe die Tabelle danach so aus:
------------------
| Index | value |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| . | |
| . | |
| . | |
| 20 | |
| 21 | |
| 22 | |
| 23 | Wert |
| 24 | |
------------------
Da die Funktion immer gleich arbeitet, laesst sich jederzeit rekonstruieren, welcher Wert
dem Schluessel 203 zugeordnet ist, naemlich indem die Summe einfach nochmal gebildet wird.
Durch die Natur dieser Speicherart ist es allerdings nicht moeglich, nachzuvollziehen in
Welcher Reihenfolge die Werte eingefuegt wurden. Denn fuegt man nun einen Wert mit dem Key
200 hinzu (binaer dargestellt als 0000000011001000, daraus resultierende Hash-Summe 10100,
dezimal also 20), so ist dessen Position in der Tabelle _vor_ der Position des Wertes mit
dem Schluessel 203:
------------------
| Index | value |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| . | |
| . | |
| . | |
| 20 | Wert1 |
| 21 | |
| 22 | |
| 23 | Wert |
| 24 | |
------------------
Du siehst: es liegt in der Natur dieses Speicherverfahrens, dass die Reihenfolge der
Schluessel nicht erhalten bleibt.
speichert PHP diese Reihenfolge in einer Liste.
Das sage ich doch die ganze Zeit. PHP kann keine Arrays ohne (verkettete) Listen!
Nein, was du gesagt hast war folgendes: PHP speichert einen Array als verkettete Liste und
deshalb ist ein beliebiger Zugriff nicht moeglich. Das ist falsch.
Die Groesse des Arrays auf C-Ebene ergibt sich aus der Anzahl der Elemente
multipliziert mit der Groesse eines Pointers auf ein Element der Liste.
Das ist aber Unsinn.
Nein.
Denn es sollen nicht die Pointer der Liste sortiert werden, sondern die Keys des
"Arrays", die aber Datenelemente der Speicherblöcke sind, auf die die Pointer verweisen,
und ganz und gar nicht keine einheitliche Größe nicht haben.
Falsch. Ein String-Array in C sieht so aus:
| Index | 0 | 1 | 2 |
| Wert | Pointer | Pointer | Pointer |
| | auf String | auf String | auf String |
| | an Addr x | an Addr y | an Addr z |
Addr x
Index | x+0 | x+1 | x+2 | x+3 | x+4 | x+5
Wert | a | b | c | d | e | \0
Synonym fuer die Addressen y und z. Die Pointer sind alle gleich gross, auf 32-Bit-Maschinen
sind sie 32 Bit (== 4 Byte) gross.
Dann wird (idR
mithilfe eines Quicksort-Algorithmus) dieser Array sortiert.
Also das Array of Pointer wird sortiert? Wem nützt das? Doch bestenfalls dem
Betriebsssytem aber nicht der Anwendungsschicht.
Falsch. Ein sortierter Array von Key-Pointern bedeutet, wir haben den Array auf PHP-Ebene
sortiert. Denn dieser sortierte Array auf C-Ebene wird wieder in seine
Listen-Repraesentation umgeformt.
Ich hatte ja meine Begriffsdefinition für "Array" mitgeteilt und Du hast nicht
widersprochen bisher.
Ich habe dir erklaert, was ein Array in den verschiedenen Schichten ist.
Grüße,
CK
--
Auf der ganzen Welt gibt es nichts Weicheres und Schwaecheres als Wasser. Doch in der Art, wie es dem Harten zusetzt, kommt nichts ihm gleich.
http://wwwtech.de/