explode($separator, $string) divide una stringa a ogni occorrenza di $separator e restituisce i pezzi come array. explode(',', 'apple,banana,cherry') dà ['apple', 'banana', 'cherry'].
Il separatore può essere qualsiasi stringa, non solo un carattere: explode(' and ', 'tea and milk and sugar') funziona allo stesso modo. L'operazione opposta, riunire un array in una stringa, è implode().
Sintassi e valore restituito
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
Restituisce sempre un array. Se il separatore non compare, l'array contiene l'intera stringa come unico elemento. Questo vale anche per la stringa vuota, che dà un array con dentro una stringa vuota, fonte comune di bug del tipo "il mio ciclo gira una volta con un input vuoto".
Limitare il numero di pezzi
Il terzo argomento, $limit, cambia quanti pezzi ottieni:
- Un limite positivo restituisce al massimo quel numero di pezzi. L'ultimo pezzo contiene il resto della stringa, separatori compresi.
- Un limite negativo restituisce tutti i pezzi tranne gli ultimi
abs($limit). - Un limite pari a
0viene trattato come1.
Un limite positivo è lo strumento giusto quando conta solo il primo separatore, per esempio una riga key=value in cui anche il valore può contenere =: explode('=', 'query=a=b', 2) dà ['query', 'a=b']. Le sezioni seguenti lo usano così.
Per ottenere solo l'ultimo pezzo, salva prima l'array in una variabile: $parts = explode('/', $path); $file = end($parts);. Scrivere end(explode('/', $path)) restituisce comunque il valore giusto, ma PHP stampa Notice: Only variables should be passed by reference, perché end() riceve il suo argomento per riferimento.
Dividere una stringa per a capo
explode("\n", $text) divide alle interruzioni di riga. Usa le virgolette doppie: tra apici singoli '\n' è una barra rovesciata seguita dalla lettera n, non un a capo. Il testo dei file Windows o dei form HTML spesso termina le righe con "\r\n", che lascia un "\r" di troppo alla fine di ogni pezzo. preg_split('/\R/', $text) divide a qualsiasi tipo di interruzione di riga.
Fare il trim dei pezzi e scartare quelli vuoti
Un input dell'utente come "red, green , ,blue" ha spazi intorno agli elementi e un elemento vuoto in mezzo. Passa i pezzi a trim() con array_map(), poi rimuovi le stringhe vuote con array_filter(). array_values() rinumera le chiavi dopo, perché array_filter() mantiene quelle originali.
La callback fn($c) => $c !== '' tiene la stringa "0". Un semplice array_filter($colors) la scarterebbe, perché "0" è falsy.
Trasformare una stringa in un array associativo
Impostazioni, cookie e stringhe simili a una query sono spesso salvati come coppie key=value. Usa explode due volte: una per le coppie, una per ogni coppia con un limite di 2, scomponendo i due pezzi in variabili (destrutturazione degli array).
Una coppia senza =, come debug, dà un array di un elemento, e la destrutturazione stampa Warning: Undefined array key 1. Completa il risultato a due elementi per evitarlo: [$key, $value] = explode('=', $pair, 2) + [1 => ''];.
Per una vera query string di un URL, parse_str() lo fa per te e decodifica anche %20 e +.
Dividere per più delimitatori
explode() accetta un solo separatore. Per dividere a virgole, punti e virgola o spazi, usa preg_split() con una classe di caratteri. PREG_SPLIT_NO_EMPTY scarta i pezzi vuoti che creerebbero due delimitatori di fila.
Testo giapponese e altro testo UTF-8
explode() confronta byte, e in UTF-8 un carattere intero non compare mai dentro i byte di un altro carattere, quindi dividere un testo giapponese a un separatore giapponese come 、 o una virgola a larghezza piena funziona correttamente.
explode vs str_split vs preg_split
| Funzione | Divide a | Esempio | Risultato |
|---|---|---|---|
explode() | una stringa separatrice fissa | explode('-', '2026-03-14') | ['2026', '03', '14'] |
str_split() | ogni N byte | str_split('abcdef', 2) | ['ab', 'cd', 'ef'] |
mb_str_split() | ogni N caratteri | mb_str_split('日本語') | ['日', '本', '語'] |
preg_split() | un'espressione regolare | preg_split('/\s+/', 'a b') | ['a', 'b'] |
explode() non usa espressioni regolari, quindi è più veloce di preg_split() ed è quella da usare ogni volta che il separatore è una stringa fissa.
Errore comune: un separatore vuoto
Un separatore vuoto è un errore. Da PHP 8.0 explode('', 'abc') lancia un ValueError invece di restituire false, e lo script si ferma:
PHP Fatal error: Uncaught ValueError: explode(): Argument #1 ($separator) cannot be empty in /home/index.php:3
Per dividere una stringa in caratteri, usa str_split('abc') per il testo ASCII oppure mb_str_split($s) per qualsiasi testo che possa contenere caratteri multibyte.
Domande frequenti
Cosa fa explode() in PHP?
Divide una stringa a ogni occorrenza di un separatore e restituisce i pezzi come array: explode(',', 'a,b,c') restituisce ['a', 'b', 'c']. Il separatore stesso non è incluso in nessun pezzo.
Cosa restituisce explode() se il separatore non viene trovato?
Un array con un solo elemento, l'intera stringa: explode(',', 'apple') restituisce ['apple']. Una stringa vuota dà [''], un array con una stringa vuota, quindi count() restituisce 1, non 0.
Come faccio explode di una stringa con più delimitatori in PHP?
Usa preg_split() con una classe di caratteri: preg_split('/[,;|]/', $s) divide a virgole, punti e virgola e barre verticali. Per scartare anche i pezzi vuoti, passa un limite di -1 e il flag: preg_split('/[,;|]/', $s, -1, PREG_SPLIT_NO_EMPTY).
Qual è la differenza tra explode() e str_split()?
explode() divide a un separatore che scegli tu. str_split($s, 3) taglia la stringa in blocchi di lunghezza fissa, contata in byte. Per il giapponese o altro testo multibyte usa mb_str_split($s), che conta i caratteri.
Perché explode() lancia un ValueError?
Perché il separatore è una stringa vuota. Da PHP 8.0, explode('', $s) lancia ValueError: explode(): Argument #1 ($separator) cannot be empty. Per dividere una stringa in singoli caratteri usa str_split() o mb_str_split().