mitmario.dev

Verschachtelte Arrays

PHP Sandbox 3 Min Lesezeit 4 BeispieleLektion 3 von 7

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

Eine Liste von Karteikarten
<?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

Nur eine Zeile ansehen
<?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

Eine Tabelle, die im Browser ankommt
<?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

Eine Ebene tiefer
<?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, kostenlos

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