Menu

PHPのexplode():文字列を分割して配列にする

explode(',', $string)は文字列をカンマごとに分割し、各部分を配列で返します。limit引数、改行での分割、各部分のtrim、str_splitやpreg_splitのほうが向いている場面を学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

explode($separator, $string)は、$separatorが現れるたびに文字列を分割し、各部分を配列で返します。explode(',', 'apple,banana,cherry')は['apple', 'banana', 'cherry']になります。

区切り文字は1文字に限らず、どんな文字列でもかまいません。explode(' and ', 'tea and milk and sugar')も同じように動きます。逆の処理、つまり配列をつないで文字列に戻すのはimplode()です。

構文と戻り値

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

常に配列を返します。区切り文字が現れなければ、文字列全体を唯一の要素とする配列になります。空文字列も同じで、空文字列を1つ持つ配列になり、「空の入力でループが1回実行される」というバグのよくある原因になります。

分割する数を制限する

3つ目の引数$limitで、得られる部分の数が変わります。

  • 正のlimitは、最大でその数の部分を返します。最後の部分には、区切り文字も含めて文字列の残りが入ります。
  • 負のlimitは、最後のabs($limit)個を除くすべての部分を返します。
  • limitが0なら1として扱われます。

最初の区切り文字だけが重要な場合、たとえば値の中にも=が含まれうるkey=valueの行には、正のlimitが適しています:explode('=', 'query=a=b', 2)は['query', 'a=b']になります。次の節以降ではこの使い方をします。

最後の部分だけが欲しいときは、先に配列を変数に入れます:$parts = explode('/', $path); $file = end($parts);。end(explode('/', $path))と書いても正しい値は返りますが、end()は引数を参照で受け取るので、PHPはNotice: Only variables should be passed by referenceを表示します。

改行で文字列を分割する

explode("\n", $text)は改行で分割します。ダブルクォートを使ってください。シングルクォートの'\n'は、改行ではなくバックスラッシュと文字nです。WindowsのファイルやHTMLのフォームから来るテキストは行末が"\r\n"であることが多く、各部分の末尾に余計な"\r"が残ります。preg_split('/\R/', $text)はあらゆる種類の改行で分割します。

各部分をtrimし、空の部分を取り除く

"red, green , ,blue"のようなユーザーの入力には、項目の前後に空白があり、途中に空の項目があります。array_map()で各部分をtrim()に通し、array_filter()で空文字列を取り除きます。array_filter()は元のキーを保つので、そのあとarray_values()でキーを振り直します。

コールバックfn($c) => $c !== ''は文字列"0"を残します。素のarray_filter($colors)だと、"0"はfalseと評価されるので取り除かれてしまいます。

文字列を連想配列に変換する

設定、Cookie、クエリのような文字列は、key=valueのペアで保存されることがよくあります。2回explodeします。1回目でペアに分け、2回目はlimitを2にして各ペアを分け、2つの部分を変数に展開します(分割代入)。

debugのように=を含まないペアでは要素1つの配列になり、分割代入でWarning: Undefined array key 1が表示されます。これを避けるには結果を2要素に埋めます:[$key, $value] = explode('=', $pair, 2) + [1 => ''];。

本物のURLのクエリ文字列なら、parse_str()がこれを行い、%20や+のデコードもしてくれます。

複数の区切り文字で分割する

explode()が受け取る区切り文字は1つです。カンマ、セミコロン、空白で分割するには、文字クラスを使ったpreg_split()を使います。PREG_SPLIT_NO_EMPTYは、区切り文字が2つ続いたときにできる空の部分を取り除きます。

日本語などのUTF-8テキスト

explode()はバイトを比較しますが、UTF-8では1つの文字がほかの文字のバイト列の中に現れることはないので、、や全角カンマのような日本語の区切り文字で日本語のテキストを分割しても正しく動きます。

explode、str_split、preg_splitの違い

関数分割する位置例結果
explode()決まった区切り文字列explode('-', '2026-03-14')['2026', '03', '14']
str_split()Nバイトごとstr_split('abcdef', 2)['ab', 'cd', 'ef']
mb_str_split()N文字ごとmb_str_split('日本語')['日', '本', '語']
preg_split()正規表現preg_split('/\s+/', 'a b')['a', 'b']

explode()は正規表現の処理をしないのでpreg_split()より速く、区切り文字が決まった文字列なら常にこちらを選びましょう。

よくあるミス:空の区切り文字

空の区切り文字はエラーです。PHP 8.0以降、explode('', 'abc')はfalseを返す代わりにValueErrorを投げ、スクリプトが止まります。

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

文字列を1文字ずつに分けるには、ASCIIのテキストならstr_split('abc')を、マルチバイト文字を含みうるものならmb_str_split($s)を使います。

よくある質問

PHPのexplode()は何をしますか?

区切り文字が現れるたびに文字列を分割し、各部分を配列で返します:explode(',', 'a,b,c')は['a', 'b', 'c']を返します。区切り文字そのものはどの部分にも含まれません。

区切り文字が見つからないとき、explode()は何を返しますか?

文字列全体を唯一の要素とする配列です:explode(',', 'apple')は['apple']を返します。空文字列では['']、つまり空文字列を1つ持つ配列になるので、count()は0ではなく1を返します。

PHPで複数の区切り文字で文字列を分割するには?

文字クラスを使ったpreg_split()を使います:preg_split('/[,;|]/', $s)はカンマ、セミコロン、パイプで分割します。空の部分も取り除くには、limitに-1とフラグを渡します:preg_split('/[,;|]/', $s, -1, PREG_SPLIT_NO_EMPTY)。

explode()とstr_split()の違いは何ですか?

explode()は自分で選んだ区切り文字で分割します。str_split($s, 3)は文字列をバイト単位で数えた決まった長さのかたまりに切ります。日本語などのマルチバイトのテキストには、文字単位で数えるmb_str_split($s)を使います。

explode()がValueErrorを投げるのはなぜですか?

区切り文字が空文字列だからです。PHP 8.0以降、explode('', $s)はValueError: explode(): Argument #1 ($separator) cannot be emptyを投げます。文字列を1文字ずつに分けるにはstr_split()かmb_str_split()を使います。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める