Abschnitt 5 · Lektion 6
Arrays und Text
explode und implode kennst du schon aus Lektion 3.5. Dort ging es um Text, hier geht es um das,
was zwischen den beiden herauskommt: eine Liste. Und mit allem, was du in diesem Abschnitt gelernt
hast, ist diese Liste jetzt kein Zwischenergebnis mehr, sondern etwas, mit dem du arbeiten kannst.
Von der Zeile zur Liste
<?php
$zeile = "Mia;34;Bremen";
$felder = explode(";", $zeile);
var_dump($felder);
echo "Der Name: ", $felder[0], "\n";
echo "Wie viele Felder: ", count($felder), "\n";
// Und wenn nichts zu trennen ist:
var_dump(explode(";", "nur ein Wort")); explode() nimmt ein Trennzeichen und eine Zeile und gibt dir eine nummerierte Liste zurück. Erst
das Trennzeichen, dann der Text, und ja, auch hier ist die Reihenfolge nicht die, die man raten
würde.
Zwei Dinge sind daran wichtig. Erstens: Das Trennzeichen selbst kommt in der Liste nicht mehr vor.
Zweitens: Kommt es im Text gar nicht vor, bekommst du trotzdem eine Liste zurück, nämlich eine mit
genau einem Eintrag. explode gibt niemals einfach den Text zurück, und darauf kannst du dich
verlassen.
Diese Form, eine Zeile mit einem festen Trennzeichen, ist keine Spielerei. In Abschnitt 8 liest du so eine echte Datei zeilenweise ein, und in Abschnitt 11 kommen mehrfach angehakte Kästchen aus einem Formular in genau dieser Form an.
Das Leerzeichen, an das keiner denkt
<?php
$roh = "Kirsche, Apfel ,Zitrone, Birne";
echo "Direkt zerlegt:\n";
var_dump(explode(",", $roh));
echo "\nMit trim auf jedem Teil:\n";
var_dump(array_map("trim", explode(",", $roh)));
// Dasselbe als anonyme Funktion, falls dir der
// Funktionsname als Text noch fremd ist:
echo "\nGeht auch so:\n";
var_dump(array_map(fn($teil) => trim($teil), explode(",", $roh))); Und jetzt der Fehler, den man dabei einmal macht. Menschen schreiben Aufzählungen mit einem
Leerzeichen nach dem Komma, und explode(",") nimmt dieses Leerzeichen mit in den Eintrag. Aus
Apfel wird Apfel, und das sieht in der Ausgabe genauso aus.
Auffallen tut es erst später: beim Vergleichen, denn Apfel ist nicht Apfel. Oder beim
Sortieren, denn ein Leerzeichen steht in der Zeichenreihenfolge vor jedem Buchstaben, und dann
stehen die eingerückten Einträge alle vorn.
Du könntest explode(", ") mit Leerzeichen schreiben, aber dann verlässt du dich darauf, dass die
Eingabe sauber ist. Der stabile Weg ist trim() auf jedem Eintrag, und dafür ist array_map aus
Lektion 5.4 genau das Werkzeug.
Neu daran ist nur die Schreibweise array_map("trim", ...): Statt einer anonymen Funktion steht der
Name einer vorhandenen Funktion als Text da. Das geht bei jeder Funktion, die genau ein
Argument nimmt, und spart die Klammerei. Das Beispiel zeigt beide Fassungen nebeneinander, sie tun
dasselbe.
Von der Liste zur Zeile
<?php
$obst = ["Apfel", "Birne", "Kirsche"];
echo implode(", ", $obst), "\n";
echo implode(" und ", $obst), "\n";
echo implode("\n", $obst), "\n";
echo "\nEinmal hin und zurueck:\n";
$zeile = "Mia;34;Bremen";
$felder = explode(";", $zeile);
$felder[2] = "Kiel";
echo implode(";", $felder), "\n"; implode() ist der Rückweg: Es klebt alle Einträge einer Liste mit deinem Trennzeichen aneinander.
Bei dieser Funktion steht das Trennzeichen wieder zuerst, immerhin sind die beiden untereinander
konsequent.
Das Trennzeichen darf alles sein, auch mehrere Zeichen oder ein Zeilenumbruch. Für eine Aufzählung
im Fließtext nimmt man ", ", für eine Datei "\n", und für ein <li> pro Zeile könntest du sogar
Markup nehmen.
Der zweite Teil des Beispiels zeigt die Runde, um die es in dieser Lektion eigentlich geht: zerlegen, einen Wert ändern, wieder zusammensetzen. Drei Zeilen, und genau das machst du in Abschnitt 8 mit einer Datei, in der hundert solcher Zeilen stehen.
Ausschnitte
<?php
$obst = ["Apfel", "Birne", "Kirsche", "Zitrone"];
echo "Die ersten zwei: ", implode(", ", array_slice($obst, 0, 2)), "\n";
echo "Ab dem dritten: ", implode(", ", array_slice($obst, 2)), "\n";
echo "Die letzten zwei: ", implode(", ", array_slice($obst, -2)), "\n";
echo "\nEin Wort in einzelne Zeichen:\n";
var_dump(str_split("Hallo"));
echo "\nBei Umlauten braucht es die mb-Fassung:\n";
echo "strlen sagt ", strlen("Mütze"), ", mb_strlen sagt ", mb_strlen("Mütze"), "\n";
var_dump(mb_str_split("Mütze")); array_slice() schneidet ein Stück aus einer Liste heraus, ohne das Original anzufassen. Erst die
Liste, dann ab welchem Platz, dann wie viele. Lässt du die Anzahl weg, bekommst du alles bis zum
Ende. Und eine negative Zahl zählt von hinten, was für „die letzten drei” der kürzeste Weg ist.
Am Ende noch str_split(), das ein Wort in einzelne Zeichen zerlegt. Es tut das byteweise, und
damit sind wir wieder bei dem Problem aus Lektion 3.4: Ein ü belegt zwei Bytes, und str_split
schneidet es mittendurch. Sieh es dir im Terminal an: php -r 'var_dump(str_split("Mütze"));'
liefert sechs Teile statt fünf, und die zwei in der Mitte sind keine Zeichen mehr, sondern Bruchstücke.
Für alles mit Umlauten gibt es deshalb mb_str_split(), genau wie es neben strlen ein mb_strlen
gibt.
Die Regel dazu ist kurz: Sobald Text von Menschen kommt, nimm die mb_-Fassung. Bei Kürzeln,
Dateinamen und Schlüsseln ist die normale in Ordnung und schneller.
Zum Mitnehmen
Zwischen einer Zeile Text und einer Liste liegen genau zwei Funktionen. Diesen Weg hin und zurück gehst du im Alltag ständig: eine Zeile aus einer Datei, eine Eingabe aus einem Formular, eine Spalte aus einer Tabelle.
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.