Abschnitt 5 · Lektion 1
Listen
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
<?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
<?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
<?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
<?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, 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.