dedlfix: PHP - Mysql -> Zweidimensionales Array erzeugen

Beitrag lesen

echo $begrüßung;

["mehrdimensionale" Arrays unter PHP]
Du hast in letzter Zeit häufiger auf diesen "Unterschied" hingewiesen, und ich fragte mich jedesmal, warum dir das so wichtig ist bzw. was daraus für Konsequenzen für den Programmierer folgen sollen.

Meiner Meinung nach hilft es beim Verständnis von PHP-Arrays, ein solches mit all seinen Eigenschaften zu betrachten, als es auf einen Spezialfall zu reduzieren.
In typstrengen Sprachen sind Arrays Auflistungen von Elementen gleichen Typs. Die Position eines Werts lässt sich anhand des Schlüssels multipliziert mit der Elementgröße ermitteln. Das bedeutet, dass der Schlüssel sich aus der Position des Elements ergibt, und damit lückenlos von 0 bis n geht. Das gilt auch für weitere Dimensionen. Jedes Element der ersten Dimension ist eine gleich lange Liste von Elementen der zweiten Dimension. Unterschiedlich lange Listen wären unterschiedliche Typen.

Man kann nun ein PHP-Array genauso nachbilden, dass der Eindruck eines mehrdimensionalen Arrays entsteht, doch nichts hindert einen daran, gegen die Gleichmäßigkeit eines oben erwähnten mehrdimensionalen Arrays zu verstößen. Man kann Elemente mittendrin entfernen, kann statt eines einfachen Elements eine komplizierte Struktur speichern, kann eine Baumstruktur unterschiedlich tiefer Verästelungen erstellen usw. usw. Am Ende bleibt es aber immer eine Auflistung, die beliebige einfache Werte oder auch Auflistungen (die ihrerseits wieder ...) aufnehmen kann.

Damit ergibt sich, dass die Position eines Elements mal hier, mal da, mal dort sein kann (der Abstand zwischen den Elementen $a[0][$x], $a[1][$x] und $a[2][$x] nicht immer gleich ist), und sich nicht so einfach berechnen lässt.

Selbst wenn man selbst so diszipliniert ist und die Gleichmäßigkeit aufrecht erhält, kann PHP nicht davon ausgehen, dass das so bleibt und seinerseits intern eine Struktur verwenden, dessen Elementposition man mit einer Multiplikation ermitteln kann.

Da die Typen der Elemente beliebige sein können, ist es auch die Größe der Daten.

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? 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.

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, 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.

Außerdem kann die Anordnung der Schlüssel beliebig sein. Das bedeutet nun, dass man die Speicherposition der Koordinate (x,y) nicht anhand von x·y·Elementgröße errechnen kann, sondern für den Zugriff immer einzeln das äußere Array und dann eins der inneren Arrays nach den jeweiligen x- und y-Schlüsseln durchsucht werden müssen.

Das klingt gefährlicher als es wirklich ist, denn das Finden des Wertes an der "Koordinate (x,y)" bedeutet in diesem konkreten Beispiel bloß das Abfragen jeweils eines Werte aus zwei Hashmaps. Es müssen also nicht die einzelnen Arrays Schritt für Schritt durchsucht werden, wie du andeutest -- zumindest habe ich deinen letzten Satz oben so verstanden.

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. 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.

echo "$verabschiedung $name";