Abschnitt 5 · Lektion 3
Verschachtelte Arrays
Ein Array darf als Wert wieder ein Array enthalten. Das klingt nach einem Kunststück, ist aber der Normalfall, sobald es um mehr als eine Sache geht: Aus einer Karteikarte wird ein Karteikasten.
Erst die Zeile, dann das Feld
<?php
$leute = [
["name" => "Mia", "alter" => 34],
["name" => "Ben", "alter" => 17],
["name" => "Tom", "alter" => 41],
];
// Zwei Klammerpaare: erst die Zeile, dann das Feld.
echo $leute[0]["name"], " ist ", $leute[0]["alter"], "\n";
echo $leute[2]["name"], " ist ", $leute[2]["alter"], "\n";
echo "\nAlle der Reihe nach:\n";
foreach ($leute as $person) {
echo $person["name"], " (", $person["alter"], ")\n";
} Die äußere Ebene ist eine ganz normale nummerierte Liste, so wie in Lektion 5.1. Nur liegt an jedem Platz kein Text, sondern eine Zuordnung aus Lektion 5.2.
Beim Zugriff hängst du die beiden Klammerpaare einfach hintereinander. $leute[0]["name"] liest
sich von links nach rechts: nimm die erste Zeile, und daraus das Feld name. Genau in dieser
Reihenfolge liest PHP es auch.
Das foreach darüber ist dann der eigentliche Gewinn. Du bekommst in jedem Durchgang eine ganze
Zeile in die Hand, und innerhalb des Blocks arbeitest du mit ihr wie mit einer einzelnen
Karteikarte. Der Index verschwindet, und du schreibst nirgends mehr eine Zahl hin.
Merk dir diese Form gut. In Abschnitt 14 kommt aus der Datenbank genau das zurück: eine Liste, und jeder Eintrag darin eine Zeile mit Spaltennamen als Schlüssel. Was du hier schreibst, wirst du dort wörtlich wiedersehen.
Ansehen, ohne den Überblick zu verlieren
<?php
$leute = [
["name" => "Mia", "alter" => 34],
["name" => "Ben", "alter" => 17],
["name" => "Tom", "alter" => 41],
];
echo "Nur die erste Zeile:\n";
var_dump($leute[0]);
echo "\nNur die Namen:\n";
foreach ($leute as $nummer => $person) {
echo $nummer, ": ", $person["name"], "\n";
} var_dump() auf eine verschachtelte Struktur ist gut gemeint und meistens unlesbar. Bei zwanzig
Zeilen mit je sechs Feldern scrollst du an der Antwort vorbei.
Deshalb der Rat, der dir noch oft helfen wird: Sieh dir eine Zeile an, nicht alles.
var_dump($leute[0]) zeigt dir den Aufbau, und der ist ja bei allen anderen derselbe. Wenn du
wissen willst, ob die Daten überhaupt angekommen sind, reicht ein foreach über die Namen.
Das ist keine Bequemlichkeit, sondern die Arbeitsweise. Beim Suchen eines Fehlers willst du eine Frage nach der anderen beantworten, und dafür brauchst du kleine Ausgaben statt großer.
Dieselbe Schleife, nur für den Browser
<?php
$leute = [
["name" => "Mia", "alter" => 34, "ort" => "Bremen"],
["name" => "Ben", "alter" => 17, "ort" => "Kiel"],
["name" => "Tom", "alter" => 41, "ort" => "Erfurt"],
];
echo "<table border=\"1\" cellpadding=\"6\">\n";
echo " <tr><th>Name</th><th>Alter</th><th>Ort</th></tr>\n";
foreach ($leute as $person) {
echo " <tr>";
echo "<td>", $person["name"], "</td>";
echo "<td>", $person["alter"], "</td>";
echo "<td>", $person["ort"], "</td>";
echo "</tr>\n";
}
echo "</table>\n"; Hier läuft ein Server, als einzigem Beispiel in diesem Abschnitt, und deshalb steht im Reiter
Browser eine Seite. Der Grund ist derselbe wie in Lektion 4.5: Ein <table> aus einer Liste von
Zuordnungen ist der häufigste Einsatz überhaupt, und er lässt sich schlecht beschreiben, solange man
ihn nicht sieht.
Sieh dir beide Stellen an. Im Browser steht die Tabelle, mit Rahmen und Spalten. Tipp dann
php index.php im Terminal: Da steht dieselbe Ausgabe noch einmal, aber als Zeichen, spitze
Klammer, t, d. Derselbe Code, zweimal angesehen.
Beachte dabei den Aufbau: Kopf und Fuß der Tabelle werden einmal ausgegeben, die Zeilen kommen aus der Schleife. Genau dieses Muster steckt hinter fast jeder Übersichtsseite im Web, und ab Abschnitt 10 schreibst du es nicht mehr für die Kommandozeile, sondern für einen echten Server.
In den anderen fünf Lektionen dieses Abschnitts läuft kein Server, und das ist kein
Ausfall. Dort geht es um Schlüssel, Typen und Reihenfolgen, und dafür ist die Ausgabe im Terminal die
richtige Ansicht: Ein Browser faltet Leerraum zusammen, und die ausgerichteten Ausgaben von
var_dump fielen dabei in sich zusammen.
Und wenn es noch tiefer geht
<?php
$leute = [
["name" => "Mia", "hobbys" => ["Klettern", "Schach"]],
["name" => "Ben", "hobbys" => ["Kochen"]],
];
// Drei Klammerpaare, wenn man genau eines will:
echo $leute[0]["hobbys"][1], "\n\n";
foreach ($leute as $person) {
echo $person["name"], ":\n";
foreach ($person["hobbys"] as $hobby) {
echo " - ", $hobby, "\n";
}
} Es hört bei zwei Ebenen nicht auf. Ein Feld darf selbst wieder eine Liste sein, und dann brauchst du drei Klammerpaare, um an einen einzelnen Wert zu kommen.
Praktisch schreibt man das aber selten. Üblicher ist die verschachtelte Schleife: außen über die
Personen, innen über deren Hobbys. Achte im Beispiel darauf, dass die innere Schleife über
$person["hobbys"] läuft, also über ein Feld der aktuellen Zeile, und nicht noch einmal über alles.
Ein Rat zum Schluss: Tiefer als drei Ebenen wird es unangenehm. Wenn du beim Lesen deines
eigenen Codes anfangen musst, Klammern zu zählen, ist das ein Zeichen. Am Ende des nächsten
Abschnitts kommt dafür ein besseres Werkzeug, nämlich Objekte, und ab dann heißt dieselbe Sache
$person->name.
Zum Mitnehmen
Eine Liste von Zuordnungen. Klingt nach einer Fingerübung, ist aber die Form, in der dir Daten ab jetzt fast immer begegnen: so kommt eine Datenbanktabelle zurück, so sieht eine JSON-Antwort aus, so liegt eine abgeschickte Tabelle im Formular.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 4 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.