Nachdem ich nun schon seit Wochen irgendwie daran knabbere, die Struktur von Arrays zu verstehen, hat ChatGPT mir heute sehr geholfen, indem es Namen für Arraytypen benutzt hat – und auf Nachfrage natürlich auch erklären konnte.
Also, es gibt in php zwei Typen von arrays: numerische Arrays und assoziative Arrays. Der Unterschied liegt in der Art, wie die einzelnen Einträge des Arrays angesprochen werden.
Numerische Arrays
…werden einfach über eine Zahl angesteuert. In genau der Reihenfolge, in der die Werte in das Arrays reingeschrieben werden, kann man sie ansteuern. Beispiel:
$rows = array ( 'Hans', 'Paul', 'Lisa');
Rufe ich jetzt $rows[0] auf, erhalte ich Hans, und $rows[2] gibt mir Lisa. Natürlich geht das auch mit einem mehrdimensionalen Array, und genau das passiert auch, wenn ich Daten aus einer Datenbank in eine Variable wie $rows hineinschreibe:
$rows= (('Hans','12'), ('Paul', '12'), ('Lisa','11'));
Bei diesem mehrdimensionalen Arrays ruft $rows[2] dann zum Beispiel den Array (‚Lisa‘, ’11‘) auf.
Assoziative Arrays
… haben Schlüssel (Strings oder andere Skalare), um Einträge ansteuern zu können, was genauere Zugriffe auch ohne Kenntnis der Reihenfolge ermöglicht. Im Falle des Zugriffs auf eine Datenbank sind die einzelnen Arrays in einer Zeile assoziierte Arrays: Sie haben die Benennungen der jeweiligen Spalte als Schlüssel. Im Beispiel oben wäre es zum Beispiel der Array von Lisa, den man auch so erstellen könnte:
$lisa=array ('name'=>'Lisa', 'alter'=>'11');
Mit $lisa[’name‘] bekomme ich dann „Lisa“ und mit $lisa[‚alter‘] bekomme ich die 11. (Zahlen müssen nicht zwingend in Hochkommata, das kommt auf den Variablentyp an.)
Anwendung
Wenn ich eine Variable mit den kompletten Inhalten einer Tabelle fülle, entsteht ein numerisches Array, das mit assoziativen Arrays gefüllt ist. Gut kann man die unterschiedlichen Zugriffe hier sehen:
foreach ($rows as $key => $value) {
if ($value [‘name’]==‘.‘ OR $value == $rows[0]) {
echo $value[‘name‘];
}
}
$rows ist hier die Variable mit den Inhalten der Datenbank. In jeder Runde wird $key als Zählvariable hochgezählt und in $values wird der assoziative Array geschrieben, der an der jeweiligen Stelle des numerischen Arrays $rows steht. $value[’name‘] greift dann also auf die Spalte „name“ zu und zwar in dem Eintrag, in dem ich halt gerade von der Runde her bin.
Das ist die Tabelle in der Ansicht von php MyAdmin. Ich habe also 6 Einträge, d.h. $rows hat 6 Einträge, die ich mit $rows[0] bis $rows[5] ansteuern kann. In jedem Eintrag steckt ein assoziatives Array mit den Schlüsseln „id“ und „name“.
Bin ich also gerade in der 3. Runde, dann ist $values[’name‘] gerade „ein“ und meine Ausgabe mit dem echo schreibt in meinen HTML-Code das hinein.
Man kann die Variable $key auch benutzen, um in dieser Situation direkt auf $rows einzuwirken. $rows bleibt ja nach der Schleife bestehen, während $value jede Runde neu befüllt hat und nach Ende der Schleife einfach nur den Inhalt der letzten Tabellenzeile hat. Nehmen wir an, ich möchte für die Ausgabe auf meiner Webseite allen Einträgen noch den Nachnamen Müller ergänzen. Dann kann ich eine Schleife laufen lassen, die so aussieht:
foreach ($rows as $key => $value) {
$rows[$key]['name']=$value['name']." Müller";
}
}
Danach wäre nun in der Tabelle der Datenbank immer noch dasselbe, aber der Array $rows hat veränderte Teilarrays:
$rows = ((‚id’=>1, ’name’=>’Das Müller‘), ((‚id’=>2, ’name’=>’ist Müller‘), …). Darauf kann ich weiter hinten im Code zurückgreifen. Zum Beispiel kann man so Leerzeichen ergänzen oder direkt in $rows den HTML- bzw. CSS-Code hinzufügen, um es später im echo direkt verfügbar zu haben. In der Praxis kann man auch besondere Zeichen umwandeln, um z.B. Konflikte zwischen php, javascript und der HTML-Ausgabe durch Befehlszeichen wie / oder <> im Text zu reduzieren.