Blaubart: PHP - Mysql -> Zweidimensionales Array erzeugen

Beitrag lesen

Tach.

In PHP werden Variablen intern durch ein C-Struct repräsentiert, welches u. a. den Wert und den (aktuellen) Typ der Variablen speichert. Es gibt also keine Unterschiede in der Größe, nur weil die Typen unterschiedlich sind.

Du willst mir jetzt nicht sagen, dass ein String der Länge 1 und ein String der Länge "no practical bound" den gleichen Speicherplatz verbraucht?

Nein, will ich nicht. Ich bezog mich auf deine Aussage zu Arrays, und in denen ist intern nunmal z. B. nicht der String gespeichert, sondern das Struct. Daß in diesem Struct der entsprechende Zeiger natürlich auf eine Stelle im Speicher verweist, an dem die sich tatsächliche Zeichenkette befindet (und daß die natürlich sehr wohl unterschiedlich viel Platz verbraucht, je nach Inhalt), stellt ich ja gar nicht in Abrede.

Es mag ja sein, dass die Verwaltungsstruktur einer Variable stets gleich groß ist, aber dass das auch für ihren Inhalt gilt, wage ich zu bezweifeln.

Das war, wie oben erklärt, auch nicht meine Aussage.

Arrays werden in PHP über Hashmaps verwaltet, die eben solche Structs enthalten.

Gut, hier hab ich anscheinend noch ein Wissensdefizit. Wenn vom Schlüssel ein Hashwert gebildet wird, damit, wie ich annehme, die Elemente der Schlüssel-Liste eine gleiche Länge haben ...

Der eigentliche Sinn einer solche Hashmap ist es, den Zugriff auf seine Elemente mit O(1) zu ermöglichen. Was genau du jetzt mit der Länge der Elemente meinst, weiß ich nicht.

... wie kommt dann PHP an den ungehashten Wert des Schlüssels ($key) bei einem foreach ($array as $key => $value)? Meines Wissens nach ist Hashwert-Bilden eine unumkehrbare Operation.

Das kann ich dir aus dem Kopf leider auch nicht beantworten. Dazu müßte ich nachschauen, wie foreach intern umgesetzt wurde.

Die Schlüsselauflistung - ob nun mit gehashten Werten oder nicht - muss durchsucht werden. Die Schlüssel können, wie erwähnt, in beliebiger Reihenfolge abgelegt sein, so dass die Position eines Elements sich nicht mit einer vergleichsweise einfachen Multiplikation errechnen lässt.

Deshalb benutzt man ja eine Hashmap. Der Hash beschreibt dann eindeutig die Position des Elements -- eben *ohne* die gesamte Liste zu durchsuchen. Wie gesagt, O(1).

Hat PHP den Schlüssel in der ersten "Dimension" gefunden, hat es nun ein weiteres Array vor sich (die zweite "Dimension"), dessen Schlüssel-Liste es nun durchsuchen muss.

Daß tatsächlich zwei Strukturen (bei diesem konkreten zweidimensionalen Beispiel) hintereinander bearbeitet werden müssen, ist richtig. Sagte ich ja auch schon. Nur müssen diese Strukturen eben nicht aufwendig durchsucht werden.

Interessantes Thema jedenfalls ... Allerdings muß ich jetzt zu einem langen, computerlosen Wochenende ins Ausland aufbrechen. Mal sehen, ob der Thread am Sonntagabend noch da ist. ;)

--
Once is a mistake, twice is jazz.