explode($separator, $string) teilt einen String an jedem Vorkommen von $separator und liefert die Teile als Array. explode(',', 'apple,banana,cherry') ergibt ['apple', 'banana', 'cherry'].
Das Trennzeichen kann ein beliebiger String sein, nicht nur ein Zeichen: explode(' and ', 'tea and milk and sugar') funktioniert genauso. Die umgekehrte Operation, ein Array wieder zu einem String zu verbinden, ist implode().
Syntax und Rückgabewert
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
Es liefert immer ein Array. Kommt das Trennzeichen nicht vor, enthält das Array den ganzen String als einziges Element. Das gilt auch für den leeren String, der ein Array mit einem leeren String darin ergibt, eine häufige Quelle für Bugs nach dem Muster „meine Schleife läuft bei leerer Eingabe einmal“.
Die Anzahl der Teile begrenzen
Das dritte Argument, $limit, ändert, wie viele Teile du bekommst:
- Ein positives Limit liefert höchstens so viele Teile. Das letzte Teil enthält den Rest des Strings, mitsamt Trennzeichen.
- Ein negatives Limit liefert jedes Teil außer den letzten
abs($limit). - Ein Limit von
0wird wie1behandelt.
Ein positives Limit ist das richtige Werkzeug, wenn nur das erste Trennzeichen zählt, zum Beispiel bei einer Zeile key=value, in deren Wert auch = vorkommen kann: explode('=', 'query=a=b', 2) ergibt ['query', 'a=b']. Die nächsten Abschnitte verwenden es so.
Um nur das letzte Teil zu bekommen, speicherst du das Array zuerst in einer Variable: $parts = explode('/', $path); $file = end($parts);. end(explode('/', $path)) liefert zwar den richtigen Wert, aber PHP gibt Notice: Only variables should be passed by reference aus, weil end() sein Argument per Referenz nimmt.
Einen String nach Zeilenumbruch aufteilen
explode("\n", $text) teilt an Zeilenumbrüchen. Verwende doppelte Anführungszeichen: In einfachen ist '\n' ein Backslash gefolgt vom Buchstaben n, kein Zeilenumbruch. Text aus Windows-Dateien oder HTML-Formularen beendet Zeilen oft mit "\r\n", was am Ende jedes Teils ein verirrtes "\r" hinterlässt. preg_split('/\R/', $text) teilt an jeder Art von Zeilenumbruch.
Die Teile trimmen und leere verwerfen
Nutzereingaben wie "red, green , ,blue" haben Leerzeichen um die Einträge und einen leeren Eintrag in der Mitte. Schick die Teile mit array_map() durch trim() und entferne dann leere Strings mit array_filter(). array_values() nummeriert die Schlüssel danach neu, weil array_filter() die ursprünglichen behält.
Der Callback fn($c) => $c !== '' behält den String "0". Ein bloßes array_filter($colors) würde ihn verwerfen, weil "0" falsy ist.
Einen String in ein assoziatives Array umwandeln
Einstellungen, Cookies und Strings nach Art eines Query-Strings werden oft als Paare key=value gespeichert. Ruf explode zweimal auf: einmal für die Paare und einmal für jedes Paar mit einem Limit von 2, wobei du die zwei Teile in Variablen entpackst (Array-Destructuring).
Ein Paar ohne =, etwa debug, ergibt ein Array mit einem Element, und das Destructuring gibt Warning: Undefined array key 1 aus. Füll das Ergebnis auf zwei Elemente auf, um das zu vermeiden: [$key, $value] = explode('=', $pair, 2) + [1 => ''];.
Bei einem echten URL-Query-String erledigt parse_str() das für dich und dekodiert außerdem %20 und +.
An mehreren Trennzeichen aufteilen
explode() nimmt ein Trennzeichen. Um an Kommas, Semikolons oder Leerzeichen zu teilen, verwendest du preg_split() mit einer Zeichenklasse. PREG_SPLIT_NO_EMPTY verwirft die leeren Teile, die zwei Trennzeichen hintereinander erzeugen würden.
Japanischer und anderer UTF-8-Text
explode() vergleicht Bytes, und in UTF-8 taucht ein vollständiges Zeichen nie in den Bytes eines anderen Zeichens auf, also funktioniert es korrekt, japanischen Text an einem japanischen Trennzeichen wie 、 oder einem vollbreiten Komma zu teilen.
explode vs str_split vs preg_split
| Funktion | Teilt an | Beispiel | Ergebnis |
|---|---|---|---|
explode() | einem festen Trenn-String | explode('-', '2026-03-14') | ['2026', '03', '14'] |
str_split() | alle N Bytes | str_split('abcdef', 2) | ['ab', 'cd', 'ef'] |
mb_str_split() | alle N Zeichen | mb_str_split('日本語') | ['日', '本', '語'] |
preg_split() | einem regulären Ausdruck | preg_split('/\s+/', 'a b') | ['a', 'b'] |
explode() macht keine Regex-Arbeit, ist also schneller als preg_split() und die erste Wahl, wann immer das Trennzeichen ein fester String ist.
Typischer Fehler: ein leeres Trennzeichen
Ein leeres Trennzeichen ist ein Fehler. Seit PHP 8.0 wirft explode('', 'abc') einen ValueError, statt false zu liefern, und das Skript stoppt:
PHP Fatal error: Uncaught ValueError: explode(): Argument #1 ($separator) cannot be empty in /home/index.php:3
Um einen String in Zeichen zu teilen, verwendest du str_split('abc') für ASCII-Text oder mb_str_split($s) für alles, was Multibyte-Zeichen enthalten kann.
Häufig gestellte Fragen
Was macht explode() in PHP?
Es teilt einen String an jedem Vorkommen eines Trennzeichens und liefert die Teile als Array: explode(',', 'a,b,c') liefert ['a', 'b', 'c']. Das Trennzeichen selbst steht in keinem Teil.
Was liefert explode(), wenn das Trennzeichen nicht gefunden wird?
Ein Array mit einem Element, dem ganzen String: explode(',', 'apple') liefert ['apple']. Ein leerer String ergibt [''], ein Array mit einem leeren String, also liefert count() 1 und nicht 0.
Wie teile ich in PHP einen String an mehreren Trennzeichen?
Verwende preg_split() mit einer Zeichenklasse: preg_split('/[,;|]/', $s) teilt an Kommas, Semikolons und senkrechten Strichen. Um außerdem leere Teile zu verwerfen, übergibst du ein Limit von -1 und das Flag: preg_split('/[,;|]/', $s, -1, PREG_SPLIT_NO_EMPTY).
Was ist der Unterschied zwischen explode() und str_split()?
explode() teilt an einem Trennzeichen, das du wählst. str_split($s, 3) schneidet den String in Stücke fester Länge, gezählt in Bytes. Für Japanisch oder anderen Multibyte-Text verwendest du mb_str_split($s), das Zeichen zählt.
Warum wirft explode() einen ValueError?
Weil das Trennzeichen ein leerer String ist. Seit PHP 8.0 wirft explode('', $s) den Fehler ValueError: explode(): Argument #1 ($separator) cannot be empty. Um einen String in einzelne Zeichen zu teilen, verwendest du str_split() oder mb_str_split().