file()
La funzione file() di PHP legge il contenuto di un file e lo memorizza in un array, una riga per elemento. Scopri sintassi, flag e gestione degli errori.
Cos'è la funzione file()?
La funzione file() legge un intero file in un array, dove ogni elemento dell'array corrisponde a una riga del file. È il modo più rapido per ottenere le righe di un file in un array PHP con una sola chiamata — non è necessario aprire un handle, iterare con fgets() o chiudere nulla in seguito.
Usa file() quando vuoi elaborare un file riga per riga: contare le righe, filtrare le voci, leggere un elenco di valori o analizzare un piccolo log. Per ottenere una singola stringa invece di un array, usa file_get_contents(); per scrivere un file in una sola chiamata, usa file_put_contents().
Sintassi
file(string $filename, int $flags = 0, ?resource $context = null): array|false| Parametro | Descrizione |
|---|---|
$filename | Percorso del file da leggere. Può essere un percorso locale o un URL (se allow_url_fopen è abilitato). |
$flags | Facoltativo. Uno o più flag, combinati con l'operatore OR bit a bit (|). Vedi la tabella seguente. |
$context | Facoltativo. Una risorsa di contesto stream creata con stream_context_create(). |
Valore restituito: un array di righe, oppure false in caso di errore (ad esempio, se il file non esiste). Per impostazione predefinita, ogni riga mantiene il carattere di ritorno a capo finale (\n).
Il parametro flags
$flags consente di controllare il modo in cui vengono lette le righe. Combinali con |:
| Flag | Effetto |
|---|---|
FILE_IGNORE_NEW_LINES | Rimuove il carattere di nuova riga alla fine di ogni riga. |
FILE_SKIP_EMPTY_LINES | Salta le righe vuote (più utile insieme a FILE_IGNORE_NEW_LINES). |
FILE_USE_INCLUDE_PATH | Cerca il file anche nell'include_path. |
<?php
// Lines without trailing "\n", and no blank lines.
$lines = file('myfile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);Come usare la funzione file()
Un esempio autonomo che crea un file, lo legge con file() e itera sulle righe:
<?php
// Create a small file to read.
file_put_contents('myfile.txt', "First line\nSecond line\nThird line\n");
$lines = file('myfile.txt');
foreach ($lines as $lineNumber => $line) {
echo "Line #{$lineNumber}: " . trim($line) . "\n";
}Questo stampa:
Line #0: First line
Line #1: Second line
Line #2: Third lineLe chiavi dell'array sono numeri di riga a base zero e i valori sono il contenuto delle righe. Usiamo trim() per rimuovere il carattere di nuova riga finale che file() mantiene per impostazione predefinita — passare FILE_IGNORE_NEW_LINES produrrebbe lo stesso risultato al momento della lettura.
Contare le righe di un file
Poiché file() restituisce un array, count() fornisce direttamente il numero di righe:
<?php
file_put_contents('myfile.txt', "alpha\nbeta\ngamma\n");
$lines = file('myfile.txt', FILE_IGNORE_NEW_LINES);
echo "The file has " . count($lines) . " lines.\n"; // The file has 3 lines.Gestione degli errori
Quando il file non può essere letto, file() restituisce false ed emette un avviso. Controlla sempre il risultato prima di iterare:
<?php
$lines = @file('does-not-exist.txt');
if ($lines === false) {
echo "Could not read the file.\n";
} else {
echo "Read " . count($lines) . " lines.\n";
}L'operatore @ sopprime l'avviso predefinito, così puoi gestire l'errore autonomamente.
Attenzioni
- L'intero file in memoria.
file()carica tutte le righe in un array in una sola volta. Per file molto grandi, apri un handle confopen()e leggi riga per riga confgets(). - I caratteri di nuova riga vengono mantenuti a meno che non si passi
FILE_IGNORE_NEW_LINES. Questo causa problemi nei confronti di stringhe esatti, ad esempio$lines[0] === 'value'fallisce quando l'elemento è in realtà"value\n". - Verifica l'esistenza prima se vuoi evitare avvisi: abbinalo a
file_exists()oppure sopprimilo con@.
Conclusione
La funzione file() è il modo più semplice per leggere un file in un array di righe in PHP. Usa i flag FILE_IGNORE_NEW_LINES e FILE_SKIP_EMPTY_LINES per ottenere righe pulite, controlla sempre che il valore restituito non sia false e preferisci fgets() per i file troppo grandi da tenere in memoria.