PHP でデータを扱っていると、「カンマ区切りの文字列を 1 件ずつ取り出したい」「配列の中身をまとめて 1 つの文字列として表示したい」という場面によく出会います。そんなときに使うのが explode() と implode() です。この記事では、文字列を配列に分割する explode() と、配列を文字列に連結する implode() の基本から、引数の意味、実践的な使い方、つまずきやすいポイントまでをまとめて解説します。PHP を学び始めた方を対象に、実際に動くコードで丁寧に説明していきます。
目次
explode と implode は何をする関数か
explode() と implode() は、文字列と配列を相互に変換するための関数です。名前のとおり explode は「爆発させる=バラバラに分ける」、implode は「内側に向かって押し込む=1 つにまとめる」というイメージで覚えると分かりやすいです。
explode() は、指定した区切り文字を境にして文字列を分割し、結果を配列として返します。逆に implode() は、配列の各要素のあいだに区切り文字を挟みながら 1 つの文字列に連結します。この 2 つはちょうど逆の働きをするので、ペアで覚えてしまうのがおすすめです。
基本の使い方
まずは一番シンプルな例を見てみましょう。explode() でカンマ区切りの文字列を配列に分割し、implode() でその配列を別の区切り文字で連結し直しています。
<?php
// 文字列を「,」で分割して配列にする
$fruits = explode(",", "りんご,みかん,ぶどう");
print_r($fruits);
// Array ( [0] => りんご [1] => みかん [2] => ぶどう )
// 配列を「 / 」でつないで 1 つの文字列にする
$text = implode(" / ", $fruits);
echo $text;
// りんご / みかん / ぶどう
explode() は区切り文字(ここでは ",")を見つけるたびに文字列を切り分け、その区切り文字自体は結果に含めません。implode() は逆に、要素のあいだだけに区切り文字を挟むので、要素が 3 つなら区切り文字は 2 箇所にだけ入ります。先頭や末尾には付かない点も覚えておきましょう。
explode と implode の引数
2 つの関数は引数の意味も、そして引数を渡す順番も異なります。特に implode() は順番を間違えやすいので、ここで整理しておきましょう。
explode の引数
explode() の構文は explode(string $separator, string $string, int $limit = PHP_INT_MAX): array です。第 1 引数に「区切り文字」、第 2 引数に「分割したい文字列」を渡します。
| 引数 | 説明 |
|---|---|
$separator | 区切りとして使う文字列。空文字を渡すとエラーになる(後述)。 |
$string | 分割の対象となる元の文字列。 |
$limit | 返す配列の最大要素数(省略可)。正の値・0・負の値で挙動が変わる。 |
implode の引数
implode() の構文は implode(string $separator, array $array): string です。第 1 引数が「あいだに挟む区切り文字」、第 2 引数が「連結したい配列」になります。explode() と同じく区切り文字が先、というのがポイントです。
| 引数 | 説明 |
|---|---|
$separator | 各要素のあいだに挟む文字列。省略すると空文字(要素をそのまま連結)になる。 |
$array | 連結したい配列。 |
implode は引数の順番に注意
implode() は歴史的な経緯から、implode($array, $separator) のように引数を逆に書いても以前は動いていました。しかしこの「引数を逆に渡す書き方」は PHP 7.4 で非推奨となり、PHP 8.0 で完全に廃止されています。現在は必ず 区切り文字を先、配列を後の順で渡してください。explode() も implode() もどちらも区切り文字が第 1 引数、と覚えておけば混乱しません。
<?php
$items = ["A", "B", "C"];
// 正しい順番:区切り文字が先、配列が後
echo implode("-", $items); // A-B-C
// 区切り文字を省略すると、そのまま連結される
echo implode($items); // ABC
実践的な使い方
基本が分かったところで、実際の開発でよく登場する使い方を見ていきましょう。
CSV 的な 1 行を分割して扱う
カンマ区切りの 1 行を explode() で分割すれば、各項目を順番に取り出して扱えます。たとえばユーザー情報をまとめた文字列から、名前やメールアドレスを取り出すといった処理です。
<?php
$line = "山田太郎,taro@example.com,東京都";
// カンマで分割して、それぞれの項目を受け取る
list($name, $email, $area) = explode(",", $line);
echo $name; // 山田太郎
echo $email; // taro@example.com
echo $area; // 東京都
分割した結果を list()(または [$name, $email, $area] = ... の短い書き方)で受け取ると、配列の各要素をまとめて変数に代入できて便利です。なお本格的に CSV ファイルを読み込む場合は、ダブルクオートやカンマを含むデータも正しく扱える fgetcsv() や str_getcsv() を使うのが安全です。explode() は、あくまで単純な区切り文字での分割に向いています。
配列をカンマ区切りで画面に表示する
チェックボックスで選ばれた値の配列などを、画面に「A, B, C」のように見やすく並べて表示したいときは implode() が活躍します。
<?php
$tags = ["PHP", "WordPress", "JavaScript"];
// 「, 」(カンマ+半角スペース)でつなぐと読みやすい
echo implode(", ", $tags);
// PHP, WordPress, JavaScript
区切り文字を ", "(カンマと半角スペース)にすると、英単語の列挙が一気に読みやすくなります。HTML の改行を入れたい場合は implode("<br>", $tags) のようにタグを区切り文字に使うこともできます。
limit で分割数を制限する
explode() の第 3 引数 $limit を使うと、分割される配列の要素数をコントロールできます。正の値を渡すと、その個数で分割を打ち切り、残りはまとめて最後の要素に入ります。「最初の 1 個だけ分けて、あとはそのまま残したい」というときに便利です。
<?php
$line = "key=value=extra";
// limit に 2 を指定:最初の「=」だけで分割し、残りはまとめる
$parts = explode("=", $line, 2);
print_r($parts);
// Array ( [0] => key [1] => value=extra )
// 負の値を指定すると、末尾からその個数を取り除く
$parts2 = explode(",", "a,b,c,d", -1);
print_r($parts2);
// Array ( [0] => a [1] => b [2] => c )
このように $limit に正の数を渡すと「最大でその数まで分割」、負の数を渡すと「末尾からその数だけ要素を捨てる」という動きになります。0 を渡した場合は 1 を指定したのと同じ扱いになり、分割されずに元の文字列が 1 要素の配列で返ります。
区切りが見つからない・空文字のときの挙動
「分割したつもりが 1 要素しか返ってこない」「思ったより要素が多い」といった結果は、入力の文字列が想定と違っていることが原因のほとんどです。explode() が特殊な入力でどう振る舞うかを知っておくと、原因をすぐ突き止められます。
区切り文字が含まれていない場合
第 2 引数の文字列の中に区切り文字が 1 つも含まれていなくても、explode() はエラーにはなりません。分割しようがないため、元の文字列をそのまま 1 つだけ持つ配列(要素数 1)を返します。
<?php
// 文字列に「,」が含まれていない
$result = explode(",", "abc");
print_r($result);
// Array ( [0] => abc )
そのため、必ず複数要素に分かれる前提でコードを書いていると、想定外の入力で「2 番目の要素が存在しない」というエラーにつながることがあります。count() で要素数を確認したり、isset() で存在をチェックしたりしておくと安全です。
空文字を分割した場合
分割対象の文字列が空文字 "" のときは、空文字を 1 つだけ持つ配列が返ります。「空なら空配列になってほしい」と思いがちですが、実際には要素数 1 の配列になるため、ループ処理などで意図せず 1 回だけ空の要素を処理してしまうことがあります。
<?php
$result = explode(",", "");
print_r($result);
// Array ( [0] => ) ← 空文字を 1 つ持つ配列(要素数 1)
var_dump(count($result)); // int(1)
入力が空のときに本当の空配列として扱いたい場合は、分割する前に if ($str === "") { $result = []; } のように空チェックをしておくとよいでしょう。
区切り文字に空文字を渡すとエラーになる
第 1 引数の区切り文字 $separator に空文字 "" を渡すと、PHP 8.0 以降では ValueError という例外が投げられ、処理が止まります(PHP 7 以前では警告を出して false を返していました)。「文字列を 1 文字ずつ分割したい」と考えて空文字を区切りに指定してしまうケースがありますが、これは explode() のやり方ではありません。
<?php
// これはエラーになる(PHP 8.0 以降)
$result = explode("", "abc");
// PHP Fatal error: Uncaught ValueError:
// explode(): Argument #1 ($separator) must not be empty
1 文字ずつ分割したいなら str_split を使う
文字列を 1 文字ずつの配列にしたいときは、専用の関数 str_split() を使います。explode() は「区切り文字で分ける」関数なので、区切りのない「1 文字ずつ」には向いていません。
<?php
// 1 文字ずつ分割する
$chars = str_split("abc");
print_r($chars);
// Array ( [0] => a [1] => b [2] => c )
// 第 2 引数で「何文字ずつ」分けるかも指定できる
$pairs = str_split("abcdef", 2);
print_r($pairs);
// Array ( [0] => ab [1] => cd [2] => ef )
なお str_split() はバイト単位で分割するため、日本語など 1 文字が複数バイトになるマルチバイト文字を 1 文字ずつ正しく分けたい場合は、mb_str_split() を使ってください。
まとめ
explode() は区切り文字で文字列を分割して配列にする関数、implode() は区切り文字を挟みながら配列を 1 つの文字列に連結する関数で、ちょうど逆の働きをします。どちらも 第 1 引数が区切り文字であることを覚えておけば、implode() の引数順を間違える心配もありません。
実際に使う際は、区切り文字が見つからないときは要素数 1 の配列が返ること、空文字を分割しても空配列にはならないこと、そして区切り文字に空文字を渡すとエラーになることに注意しましょう。1 文字ずつ分けたいときは explode() ではなく str_split()(マルチバイトなら mb_str_split())を使うのが正解です。これらを押さえておけば、文字列と配列の変換でつまずくことはほとんどなくなるはずです。