mitmario.dev

Arrays und Text

PHP Sandbox 3 Min Lesezeit 4 BeispieleLektion 6 von 7

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

Eine Zeile zerlegen
<?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

Leerzeichen, die keiner bestellt hat
<?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

Wieder zusammensetzen
<?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

Ausschnitte und einzelne Zeichen
<?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, 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.