Menu

PHP explode() : découper une chaîne en tableau

explode(',', $string) découpe une chaîne à chaque virgule et renvoie les morceaux sous forme de tableau. Le paramètre limit, découper par saut de ligne, nettoyer les morceaux, et quand str_split ou preg_split conviennent mieux.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

explode($separator, $string) découpe une chaîne à chaque occurrence de $separator et renvoie les morceaux sous forme de tableau. explode(',', 'apple,banana,cherry') donne ['apple', 'banana', 'cherry'].

Le séparateur peut être n'importe quelle chaîne, pas seulement un caractère : explode(' and ', 'tea and milk and sugar') fonctionne de la même façon. L'opération inverse, réassembler un tableau en chaîne, est implode().

Syntaxe et valeur de retour

explode(string $separator, string $string, int $limit = PHP_INT_MAX): array

Elle renvoie toujours un tableau. Si le séparateur n'apparaît pas, le tableau contient la chaîne entière comme unique élément. Cela inclut la chaîne vide, qui donne un tableau contenant une chaîne vide, source fréquente de bugs du type « ma boucle s'exécute une fois sur une entrée vide ».

Limiter le nombre de morceaux

Le troisième argument, $limit, change le nombre de morceaux obtenus :

  • Une limite positive renvoie au plus ce nombre de morceaux. Le dernier morceau contient le reste de la chaîne, séparateurs compris.
  • Une limite négative renvoie tous les morceaux sauf les abs($limit) derniers.
  • Une limite de 0 est traitée comme 1.

Une limite positive est le bon outil quand seul le premier séparateur compte, par exemple une ligne key=value dont la valeur peut aussi contenir = : explode('=', 'query=a=b', 2) donne ['query', 'a=b']. Les sections suivantes l'utilisent ainsi.

Pour obtenir seulement le dernier morceau, stockez d'abord le tableau dans une variable : $parts = explode('/', $path); $file = end($parts);. Écrire end(explode('/', $path)) renvoie quand même la bonne valeur, mais PHP affiche Notice: Only variables should be passed by reference, car end() prend son argument par référence.

Découper une chaîne par saut de ligne

explode("\n", $text) découpe aux sauts de ligne. Utilisez des guillemets doubles : entre guillemets simples, '\n' est une barre oblique inverse suivie de la lettre n, pas un saut de ligne. Le texte venant de fichiers Windows ou de formulaires HTML termine souvent les lignes par "\r\n", ce qui laisse un "\r" parasite à la fin de chaque morceau. preg_split('/\R/', $text) découpe à n'importe quel type de saut de ligne.

Nettoyer les morceaux et supprimer les vides

Une saisie comme "red, green , ,blue" a des espaces autour des éléments et un élément vide au milieu. Passez les morceaux dans trim() avec array_map(), puis supprimez les chaînes vides avec array_filter(). array_values() renumérote ensuite les clés, car array_filter() garde celles d'origine.

Le callback fn($c) => $c !== '' garde la chaîne "0". Un simple array_filter($colors) la supprimerait, car "0" est évaluée à faux.

Transformer une chaîne en tableau associatif

Les réglages, les cookies et les chaînes de type query string sont souvent stockés en paires key=value. Faites deux explode : un pour les paires, un pour chaque paire avec une limite de 2, en déballant les deux morceaux dans des variables (déstructuration de tableau).

Une paire sans =, comme debug, donne un tableau d'un seul élément, et la déstructuration affiche Warning: Undefined array key 1. Complétez le résultat à deux éléments pour l'éviter : [$key, $value] = explode('=', $pair, 2) + [1 => ''];.

Pour une vraie query string d'URL, parse_str() le fait pour vous et décode aussi %20 et +.

Découper selon plusieurs délimiteurs

explode() prend un seul séparateur. Pour découper aux virgules, points-virgules ou espaces, utilisez preg_split() avec une classe de caractères. PREG_SPLIT_NO_EMPTY supprime les morceaux vides que créeraient deux délimiteurs consécutifs.

Japonais et autres textes UTF-8

explode() compare des octets, et en UTF-8 un caractère complet n'apparaît jamais dans les octets d'un autre caractère, donc découper du texte japonais selon un séparateur japonais comme 、 ou une virgule pleine chasse fonctionne correctement.

explode, str_split ou preg_split

FonctionDécoupe selonExempleRésultat
explode()une chaîne séparatrice fixeexplode('-', '2026-03-14')['2026', '03', '14']
str_split()tous les N octetsstr_split('abcdef', 2)['ab', 'cd', 'ef']
mb_str_split()tous les N caractèresmb_str_split('日本語')['日', '本', '語']
preg_split()une expression régulièrepreg_split('/\s+/', 'a b')['a', 'b']

explode() ne fait aucun travail d'expression régulière, elle est donc plus rapide que preg_split() et c'est elle qu'il faut prendre dès que le séparateur est une chaîne fixe.

Erreur fréquente : un séparateur vide

Un séparateur vide est une erreur. Depuis PHP 8.0, explode('', 'abc') lève une ValueError au lieu de renvoyer false, et le script s'arrête :

PHP Fatal error:  Uncaught ValueError: explode(): Argument #1 ($separator) cannot be empty in /home/index.php:3

Pour découper une chaîne en caractères, utilisez str_split('abc') pour du texte ASCII ou mb_str_split($s) pour tout ce qui peut contenir des caractères multioctets.

Questions fréquentes

Que fait explode() en PHP ?

Elle découpe une chaîne à chaque occurrence d'un séparateur et renvoie les morceaux sous forme de tableau : explode(',', 'a,b,c') renvoie ['a', 'b', 'c']. Le séparateur lui-même n'apparaît dans aucun morceau.

Que renvoie explode() si le séparateur n'est pas trouvé ?

Un tableau d'un seul élément, la chaîne entière : explode(',', 'apple') renvoie ['apple']. Une chaîne vide donne [''], un tableau contenant une chaîne vide, donc count() renvoie 1, pas 0.

Comment découper une chaîne selon plusieurs délimiteurs en PHP ?

Utilisez preg_split() avec une classe de caractères : preg_split('/[,;|]/', $s) découpe aux virgules, points-virgules et barres verticales. Pour aussi supprimer les morceaux vides, passez une limite de -1 et l'option : preg_split('/[,;|]/', $s, -1, PREG_SPLIT_NO_EMPTY).

Quelle est la différence entre explode() et str_split() ?

explode() découpe selon un séparateur que vous choisissez. str_split($s, 3) coupe la chaîne en morceaux de longueur fixe, comptée en octets. Pour du japonais ou un autre texte multioctet, utilisez mb_str_split($s), qui compte des caractères.

Pourquoi explode() lève-t-elle une ValueError ?

Parce que le séparateur est une chaîne vide. Depuis PHP 8.0, explode('', $s) lève ValueError: explode(): Argument #1 ($separator) cannot be empty. Pour découper une chaîne en caractères, utilisez str_split() ou mb_str_split().

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER