W3docs

str_getcsv()

Guida alla funzione PHP str_getcsv(): sintassi, parametri, esempi pratici, analisi CSV su più righe, campi tra virgolette e insidie comuni.

La funzione str_getcsv() analizza una singola riga di testo CSV (valori separati da virgola) e restituisce i suoi campi come array piatto. È la controparte in memoria di fgetcsv(): invece di leggere una riga da un file handle aperto, opera su una stringa già disponibile — una riga incollata da un modulo, una singola riga letta da una risposta API, o un elemento di un array suddiviso manualmente.

Poiché il CSV reale è più complesso di quanto sembri (i campi possono essere racchiusi tra virgolette, contenere virgole, o estendersi oltre il delimitatore), str_getcsv() è quasi sempre la scelta giusta rispetto a un semplice explode(',', $line), che si rompe su qualsiasi virgola tra virgolette.

Sintassi

str_getcsv(
    string $string,
    string $separator = ",",
    string $enclosure = "\"",
    string $escape = "\\"
): array
ParametroObbligatorioDescrizione
$stringLa riga CSV da analizzare.
$separatorNoIl delimitatore di campo — un singolo carattere. Predefinito ,.
$enclosureNoIl carattere che racchiude i campi contenenti il delimitatore, virgolette o newline. Predefinito ".
$escapeNoIl carattere di escape. Predefinito \. Passa "" per disabilitare l'escape proprietario di PHP (raccomandato per CSV RFC 4180 strict).

La funzione restituisce sempre un array. Un campo vuoto diventa una stringa vuota (""); una riga di input completamente vuota restituisce [null].

Esempio di base

php— editable, runs on the server

Output:

Array
(
    [0] => John
    [1] => Doe
    [2] => 25
)

Ogni valore separato da virgola diventa un elemento, indicizzato a partire da 0.

Campi tra virgolette e virgole incorporate

Qui str_getcsv() dimostra il suo valore. Un campo racchiuso tra virgolette doppie può contenere il delimitatore senza che venga diviso:

<?php
$input = '"Doe, John","New York, NY",25';
$array = str_getcsv($input);

print_r($array);
?>

Output:

Array
(
    [0] => Doe, John
    [1] => New York, NY
    [2] => 25
)

Le virgolette di chiusura vengono rimosse e le virgole al loro interno vengono mantenute come dati. explode(',', $input) avrebbe erroneamente prodotto cinque elementi in questo caso.

Usare un delimitatore e un'enclosure diversi

Molti file "CSV" sono in realtà separati da punto e virgola o da tabulazione. Sovrascrivi il secondo e il terzo argomento per adeguarsi:

<?php
$input = "'Jane Doe';'Berlin';30";
$array = str_getcsv($input, ';', "'");

print_r($array);
?>

Output:

Array
(
    [0] => Jane Doe
    [1] => Berlin
    [2] => 30
)

Per una riga separata da tabulazione usa "\t" come separatore.

Analisi di una stringa CSV su più righe

str_getcsv() analizza una riga alla volta. Per trasformare un intero documento CSV in righe, suddividilo prima in righe e poi applica la funzione a ciascuna. Combinandola con array_map() il codice rimane conciso:

<?php
$csv = "name,city,age\nJohn,Boston,25\nJane,Berlin,30";

$rows = array_map('str_getcsv', explode("\n", $csv));

print_r($rows);
?>

Output:

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
        )

)

Nota: explode("\n", ...) è una semplice divisione. Se il file usa terminazioni di riga Windows (\r\n) o i campi contengono newline all'interno delle virgolette, è preferibile leggere il file con fgetcsv() in un ciclo, che gestisce nativamente questi casi.

Mappare le righe su un'intestazione

Un pattern comune è usare la prima riga come chiavi e costruire array associativi con array_combine():

<?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]);
?>

Output:

Array
(
    [name] => John
    [city] => Boston
    [age] => 25
)

Insidie comuni

  • Una sola riga per volta. Passare una stringa su più righe tratta l'intero contenuto come un singolo record, quindi dividi sempre le righe prima di analizzarle.
  • Il carattere di escape sorprende. L'escape predefinito \ di PHP non è standard. Per dati conformi a RFC 4180 (dove " viene escaped raddoppiandolo come ""), passa escape: "" per evitare che i backslash vengano inghiottiti.
  • I numeri rimangono stringhe. Ogni campo viene restituito come stringa ("25", non 25). Converti esplicitamente quando hai bisogno di numeri reali.
  • Newline finale. Una riga letta con un \n finale potrebbe produrre un ultimo campo vuoto; trimma l'input prima se necessario.

Funzioni correlate

  • fgetcsv() — legge e analizza una riga CSV direttamente da un file handle.
  • fputcsv() — scrive un array in un file come riga CSV (l'operazione inversa).
  • explode() — divide una stringa tramite un delimitatore quando non ci sono campi tra virgolette di cui preoccuparsi.
  • file_get_contents() — carica un file CSV in una stringa da passare a str_getcsv().

Esercizio

Pratica
Cosa fa la funzione str_getcsv() in PHP?
Cosa fa la funzione str_getcsv() in PHP?
Was this page helpful?