str_getcsv()
PHP str_getcsv() Funktion: Syntax, Parameter, Beispiele, mehrzeiliges CSV, Anführungszeichen-Felder und häufige Fallstricke erklärt.
Die Funktion str_getcsv() parst eine einzelne Zeile CSV-Text (kommagetrennte Werte) und gibt deren Felder als flaches Array zurück. Sie ist das In-Memory-Gegenstück zu fgetcsv(): Anstatt eine Zeile aus einem geöffneten Datei-Handle zu lesen, arbeitet sie auf einem String, den Sie bereits haben — eine Zeile aus einem Formular, eine einzelne Zeile aus einer API-Antwort oder ein Element eines Arrays, das Sie selbst aufgeteilt haben.
Da echtes CSV schwieriger ist als es aussieht (Felder können in Anführungszeichen eingeschlossen sein, Kommas enthalten oder sich über den Trennzeichenbereich erstrecken), ist str_getcsv() fast immer die bessere Wahl gegenüber einem naiven explode(',', $line), das bei jedem Komma innerhalb von Anführungszeichen versagt.
Syntax
str_getcsv(
string $string,
string $separator = ",",
string $enclosure = "\"",
string $escape = "\\"
): array| Parameter | Erforderlich | Beschreibung |
|---|---|---|
$string | Ja | Die zu parsende CSV-Zeile. |
$separator | Nein | Das Feldtrennzeichen — ein einzelnes Zeichen. Standard ,. |
$enclosure | Nein | Das Zeichen, das Felder umschließt, die das Trennzeichen, Anführungszeichen oder Zeilenumbrüche enthalten. Standard ". |
$escape | Nein | Das Escape-Zeichen. Standard \. Übergeben Sie "", um PHPs proprietäres Escaping zu deaktivieren (empfohlen für striktes RFC 4180 CSV). |
Die Funktion gibt immer ein Array zurück. Ein leeres Feld wird zu einem leeren String (""); eine vollständig leere Eingabezeile gibt [null] zurück.
Einfaches Beispiel
Ausgabe:
Array
(
[0] => John
[1] => Doe
[2] => 25
)Jeder kommagetrennte Wert wird zu einem Element, indiziert ab 0.
Felder in Anführungszeichen und eingebettete Kommas
Hier zeigt str_getcsv() seinen Mehrwert. Ein in doppelte Anführungszeichen eingeschlossenes Feld kann das Trennzeichen enthalten, ohne aufgeteilt zu werden:
<?php
$input = '"Doe, John","New York, NY",25';
$array = str_getcsv($input);
print_r($array);
?>Ausgabe:
Array
(
[0] => Doe, John
[1] => New York, NY
[2] => 25
)Die umschließenden Anführungszeichen werden entfernt, und die Kommas darin bleiben als Daten erhalten. explode(',', $input) hätte hier fälschlicherweise fünf Elemente erzeugt.
Andere Trennzeichen und Umschließungszeichen verwenden
Viele „CSV"-Dateien sind tatsächlich semikolon- oder tabulatorgetrennt. Überschreiben Sie das zweite und dritte Argument entsprechend:
<?php
$input = "'Jane Doe';'Berlin';30";
$array = str_getcsv($input, ';', "'");
print_r($array);
?>Ausgabe:
Array
(
[0] => Jane Doe
[1] => Berlin
[2] => 30
)Für eine tabulatorgetrennte Zeile verwenden Sie "\t" als Trennzeichen.
Einen mehrzeiligen CSV-String parsen
str_getcsv() parst eine Zeile auf einmal. Um ein ganzes CSV-Dokument in Zeilen umzuwandeln, teilen Sie es zunächst in Zeilen auf und verarbeiten Sie dann jede Zeile mit der Funktion. Die Kombination mit array_map() macht dies kompakt:
<?php
$csv = "name,city,age\nJohn,Boston,25\nJane,Berlin,30";
$rows = array_map('str_getcsv', explode("\n", $csv));
print_r($rows);
?>Ausgabe:
Array
(
[0] => Array
(
[0] => name
[1] => city
[2] => age
)
[1] => Array
(
[0] => John
[1] => Boston
[2] => 25
)
[2] => Array
(
[0] => Jane
[1] => Berlin
[2] => 30
)
)Hinweis:
explode("\n", ...)ist eine einfache Aufteilung. Wenn Ihre Datei Windows-Zeilenenden (\r\n) verwendet oder Felder innerhalb von Anführungszeichen Zeilenumbrüche enthalten, lesen Sie die Datei besser mitfgetcsv()in einer Schleife, da diese Fälle dort nativ behandelt werden.
Zeilen einem Header zuordnen
Ein gängiges Muster besteht darin, die erste Zeile als Schlüssel zu verwenden und assoziative Arrays mit array_combine() aufzubauen:
<?php
$lines = ['name,city,age', 'John,Boston,25', 'Jane,Berlin,30'];
$header = str_getcsv(array_shift($lines));
$people = [];
foreach ($lines as $line) {
$people[] = array_combine($header, str_getcsv($line));
}
print_r($people[0]);
?>Ausgabe:
Array
(
[name] => John
[city] => Boston
[age] => 25
)Häufige Fallstricke
- Nur eine Zeile. Das Übergeben eines mehrzeiligen Strings behandelt alles als einen einzigen Datensatz, daher müssen Sie den String immer selbst in Zeilen aufteilen, bevor Sie ihn parsen.
- Das Escape-Zeichen überrascht viele. PHPs Standard-Escaping mit
\ist nicht standardkonform. Für Daten, die RFC 4180 folgen (bei dem"durch Verdopplung als""escaped wird), übergeben Sieescape: "", damit keine Backslashes verschluckt werden. - Zahlen bleiben Strings. Jedes Feld kommt als String zurück (
"25", nicht25). Wandeln Sie explizit um, wenn Sie echte Zahlen benötigen. - Abschließender Zeilenumbruch. Eine Zeile mit einem abschließenden
\nkann ein leeres letztes Feld erzeugen; kürzen Sie die Eingabe vorher mittrim(), falls nötig.
Verwandte Funktionen
fgetcsv()— liest und parst eine CSV-Zeile direkt aus einem Datei-Handle.fputcsv()— schreibt ein Array als CSV-Zeile in eine Datei (die Umkehrfunktion).explode()— teilt einen String nach einem Trennzeichen, wenn keine Felder mit Anführungszeichen vorhanden sind.file_get_contents()— lädt eine CSV-Datei als String, um siestr_getcsv()zu übergeben.