mitmario.dev

Listen

PHP Sandbox 3 Min Lesezeit 4 BeispieleLektion 1 von 7

Eine Liste schreibst du in eckigen Klammern, die Werte durch Komma getrennt. Sie darf so lang werden, wie du willst, und in PHP dürfen sogar verschiedene Sorten Werte darin liegen. Das macht man allerdings selten, weil man beim Herausholen dann nie weiß, was man in der Hand hat.

Der Zugriff läuft über die Position

Vier Werte unter einem Namen
<?php

$obst = ["Apfel", "Banane", "Kirsche", "Zitrone"];

echo "Der erste: ", $obst[0], "\n";
echo "Der dritte: ", $obst[2], "\n";
echo "Wie viele: ", count($obst), "\n";

// Der letzte Platz ist immer count() minus eins.
echo "Der letzte: ", $obst[count($obst) - 1], "\n";

Jeder Eintrag hat eine Nummer, seinen Index, und die schreibst du in eckige Klammern hinter den Variablennamen. Gezählt wird ab null. Der erste Eintrag ist also $obst[0], und das ist die eine Sache an Listen, die am Anfang jeden einmal erwischt.

Aus Lektion 4.5 kennst du das schon: die Form von foreach mit Doppelpfeil gab dir genau diese Nummer. Sie ist keine Erfindung dieser Lektion, sie war die ganze Zeit da.

count() sagt dir, wie viele Einträge drin sind. Und weil bei null angefangen wird, liegt der letzte Eintrag immer auf count($obst) - 1. Diese kleine Rechnung wirst du oft schreiben, und die - 1 darin ist genau der Grund, warum es dafür seit PHP 7.3 auch array_key_last() gibt.

Anhängen, ohne zu rechnen

Anhängen ohne nachzuzählen
<?php

$obst = ["Apfel", "Banane"];

$obst[] = "Kirsche";
$obst[] = "Zitrone";

foreach ($obst as $platz => $name) {
    echo "Platz $platz: $name\n";
}

echo "Jetzt sind es ", count($obst), ".\n";

Für neue Einträge gibt es die kurze Form mit leeren Klammern. $obst[] = "Kirsche" heißt „häng das hinten dran”, und PHP sucht sich die nächste freie Nummer selbst. Du könntest auch $obst[2] = ... schreiben, aber dann müsstest du wissen, wie viele schon drin sind, und dich bei jeder Änderung neu verzählen.

Deshalb die Regel: beim Anhängen immer die leeren Klammern. Ein Index gehört dorthin nur, wenn du einen bestimmten Platz wirklich meinst.

Das Beispiel zeigt daneben noch etwas, das später wichtig wird: eine Liste ist nicht in Stein gemeißelt. Sie wächst, während das Programm läuft. Genau so wird ab Abschnitt 11 aus einem abgeschickten Formular eine Notiz mehr.

Ist der Wert schon dabei

Steht das schon drin
<?php

$obst = ["Apfel", "Banane", "Kirsche"];

var_dump(in_array("Banane", $obst));
var_dump(in_array("Mango", $obst));

// Locker verglichen, wie bei == aus Lektion 3.6:
$zahlen = [1, 2, 3];
var_dump(in_array("1", $zahlen));

// Mit true als drittem Argument wird streng verglichen:
var_dump(in_array("1", $zahlen, true));

in_array() beantwortet die Frage „kommt dieser Wert in der Liste vor” mit true oder false. Erst der gesuchte Wert, dann die Liste, und ja, diese Reihenfolge ist bei anderen Array-Funktionen genau andersherum. Das ist nichts, was man auswendig lernt, das schlägt man nach.

Der Haken steckt im dritten Beispiel. in_array() vergleicht standardmäßig locker, also mit == aus Lektion 3.6. Der Text "1" findet deshalb die Zahl 1. Mit true als drittem Argument vergleicht es streng, und dann findet es sie nicht mehr.

Vielleicht hast du irgendwo gelesen, in_array(0, ["Apfel"]) sei true, weil PHP den Text in eine Null verwandelt. Das stimmte einmal und ist seit PHP 8 vorbei, dieselbe Aufräumaktion, die schon in 3.6 und 4.3 vorkam; php -r 'var_dump(in_array(0, ["Apfel"]));' im Terminal sagt bool(false). Trotzdem gilt: schreib das dritte Argument hin. Es kostet fünf Zeichen und nimmt dir die Frage ab, welche Version gerade läuft.

Ein Platz, an dem nichts liegt

Ein Platz, den es nicht gibt
<?php

$obst = ["Apfel", "Banane"];

echo "Vor dem Zugriff\n";

$weg = $obst[7];
var_dump($weg);

echo "Und das Programm laeuft weiter.\n";

// Mit ?? bleibt der Fehlerkanal still:
$sicher = $obst[7] ?? "nichts da";
echo $sicher, "\n";

Und jetzt der unangenehme Teil. Fragst du einen Index ab, den es nicht gibt, stürzt PHP nicht ab. Es schreibt eine Warnung auf den Fehlerkanal, gibt dir null zurück und läuft weiter.

Sieh dir im Beispiel das Terminal genau an. Auf der Ausgabe stehen die Zeilen brav untereinander, als sei nichts gewesen. Auf dem Fehlerkanal steht daneben Undefined array key 7. Und php index.php; echo $? meldet eine 0, das Programm hält sich also selbst für erfolgreich.

Das ist die Warning aus Lektion 1.4 an der Stelle, an der sie im Alltag am häufigsten auftritt, und sie ist genau deshalb gefährlicher als ein Absturz: Ein Absturz zeigt dir die Zeile. Hier rechnet dein Programm einfach mit null weiter, und irgendwo drei Bildschirme später steht dann eine 0, die niemand erklären kann.

Das Gegenmittel kennst du schon aus Lektion 3.6: das Fragezeichenpaar ??. Es liefert den Wert, wenn er da ist, und sonst deinen Ersatz, ganz ohne Warnung. In Abschnitt 11, wenn die Werte aus einem Formular kommen und der Besucher entscheidet, welche Felder ankommen, wirst du es in fast jeder Zeile brauchen.

Zum Mitnehmen

Bisher hielt eine Variable genau einen Wert. Eine Liste hält beliebig viele, und zwar unter einem einzigen Namen. Damit fängt der wichtigste Abschnitt des Kurses an: fast alles, was PHP später aus einem Formular oder einer Datenbank zurückgibt, kommt in dieser Form.

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.