【2026年9月最新】PHP explode関数の使い方完全ガイド|limit引数・CSV処理・Claude Codeでコード生成まで
PHPで「カンマ区切りの文字列を配列に分割したい」「CSVの1行をカラムごとに分けたい」というとき、多くの人がまず出会う関数がexplode()です。
公式リファレンスの説明は簡潔ですが、実際に使ってみるとlimit引数の挙動や区切り文字が見つからない場合の動作、preg_split()やstr_split()との使い分けなど、意外とつまずくポイントが多い関数でもあります。
この記事では、explode()の基本構文から、limit引数の3パターン(正・負・ゼロ)の挙動、CSV処理や改行データの実務ユースケース、よくある落とし穴、そして非エンジニアがClaude Codeにこの手の処理を任せる方法まで、体系的に解説していきます。
01 OVERVIEW explode関数とは|基本構文を先に押さえる 指定した区切り文字で文字列を分割し、配列として返す関数
explode()は、指定した区切り文字(セパレータ)で文字列を分割し、結果を配列として返すPHPの組み込み関数です。CSVのようなカンマ区切りデータや、改行区切りのテキストを扱う場面で最も頻繁に使われる関数のひとつです。
// explode() の基本構文
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
// $separator … 区切り文字(1文字以上の文字列)
// $string … 分割対象の文字列
// $limit … 省略可。分割する要素数の上限(後述)
// 最もシンプルな例
$csv = "田中,28,東京,エンジニア";
$fields = explode(",", $csv);
print_r($fields);
// 出力:
// Array
// (
// [0] => 田中
// [1] => 28
// [2] => 東京
// [3] => エンジニア
// )
📚 用語解説
区切り文字(セパレータ):文字列を分割する基準となる文字・文字列のこと。explode()では第1引数に指定する。カンマ「,」・改行「\n」・タブ「\t」・スラッシュ「/」など、データ形式に応じて使い分ける。1文字である必要はなく、"::"のような複数文字の区切り文字も指定できる。
explode()は固定文字列での分割に特化しており、正規表現は使えません。「カンマまたはセミコロンで分割したい」のようなパターンマッチが必要な場合は、後述するpreg_split()を使う必要があります。
explode(爆発する)という関数名の通り、1つの文字列を区切り文字の位置でバラバラに「爆発」させて配列にするイメージです。逆に配列を1つの文字列に「結合」する関数がimplode()(第7章で解説)で、explode⇔implodeは対の関係にあります。
02 BASIC USAGE explode()の基本的な使い方 日付・改行データ・タブ区切りなど代表的なパターン
基本構文を理解したところで、実際によく使われるパターンをいくつか見ていきます。
2-1. 日付文字列をハイフンで分割する
$date = "2026-09-10";
$parts = explode("-", $date);
echo $parts[0]; // "2026"(年)
echo $parts[1]; // "09"(月)
echo $parts[2]; // "10"(日)
// list()での分割代入(可読性が高い)
[$year, $month, $day] = explode("-", $date);
echo "{$year}年{$month}月{$day}日"; // 2026年09月10日
2-2. 改行区切りのテキストを1行ずつの配列にする
$text = "1行目のテキスト\n2行目のテキスト\n3行目のテキスト";
$lines = explode("\n", $text);
foreach ($lines as $i => $line) {
echo ($i + 1) . ": " . $line . PHP_EOL;
}
// 出力:
// 1: 1行目のテキスト
// 2: 2行目のテキスト
// 3: 3行目のテキスト
Windowsで作成されたファイルは改行コードが"\r\n"(CRLF)、Mac/Linuxは"\n"(LF)のことが多く、explode("\n", $text)だけでは各行の末尾に"\r"が残ってしまうことがあります。環境をまたぐファイルを扱う場合は、事前にstr_replace("\r\n", "\n", $text)で改行コードを統一するか、preg_split("/\r\n|\r|\n/", $text)で分割するのが安全です。
2-3. タブ区切り(TSV)データを分割する
$tsv_line = "商品A\t1200\t50個";
$cols = explode("\t", $tsv_line);
// ["商品A", "1200", "50個"]
03 LIMIT ARGUMENT limit引数の3パターンを完全理解する 正の数・負の数・0でそれぞれ挙動がまったく異なる
explode()の第3引数limitは省略されることが多いですが、実務では非常に便利な引数です。正の数・負の数・0の3パターンで挙動が大きく異なるため、それぞれ図解付きで整理します。
| limitの値 | 挙動 | 用途 |
|---|---|---|
| 正の数(例: 2) | 指定した要素数までで分割。最後の要素には残り全部が入る | 「最初の区切りだけ分割したい」場合 |
| 負の数(例: -1) | 末尾から指定した数の要素を除外する | 「末尾のN個を捨てたい」場合 |
| 0 | 1として扱われる(PHPの内部仕様) | 実務ではほぼ使わない |
| 省略 | 無制限に分割(PHP_INT_MAXがデフォルト) | 通常はこの動作でOK |
3-1. limitが正の数の場合:最後の要素に残り全部が入る
$str = "a,b,c,d,e";
// limit = 2 → 最大2要素。2要素目に残り全部が入る
print_r(explode(",", $str, 2));
// Array ( [0] => a [1] => b,c,d,e )
// limit = 3 → 最大3要素
print_r(explode(",", $str, 3));
// Array ( [0] => a [1] => b [2] => c,d,e )
// 実務例:「キー=バリュー」形式を最初の「=」だけで分割
$kv = "url=https://example.com?a=1&b=2";
[$key, $value] = explode("=", $kv, 2);
echo $key; // "url"
echo $value; // "https://example.com?a=1&b=2"(2つ目以降の=は分割されない)
📚 用語解説
limitの正数指定:explode()のlimitに正の整数を指定すると、その数までしか配列要素を作らず、最後の要素に「残り全部の文字列」がまとめて入る。区切り文字が複数回登場する文字列で「最初の1回だけ分割したい」場合(例: URLのクエリ文字列、key=valueの解析)に非常に有用。
3-2. limitが負の数の場合:末尾から要素を除外する
$str = "a,b,c,d,e";
// limit = -1 → 末尾から1要素を除外
print_r(explode(",", $str, -1));
// Array ( [0] => a [1] => b [2] => c [3] => d )
// ※ "e" が除外される
// limit = -2 → 末尾から2要素を除外
print_r(explode(",", $str, -2));
// Array ( [0] => a [1] => b [2] => c )
// ※ "d", "e" が除外される
// 実務例:ファイルパスから拡張子部分を除いたディレクトリ階層を取得
$path = "uploads/2026/09/photo.jpg";
$dirs = explode("/", $path, -1);
// ["uploads", "2026", "09"]("photo.jpg" は含まれない)
explode($sep, $str, -2) を「配列の要素数を2にする」と誤解しがちですが、正しくは「末尾から2要素を除外する」という意味です。元の要素数が5個なら結果は3個(5-2)になります。元の要素数が2個以下の場合は空配列が返ります。
3-3. limitが0の場合:1として扱われる
$str = "a,b,c";
// limit = 0 は 1 として扱われる(PHP公式マニュアル記載の仕様)
print_r(explode(",", $str, 0));
// Array ( [0] => a,b,c )
// limit=1 を指定したときと同じ結果になる
全て分割
["a","b","c","d","e"]
最後に残り集約
["a","b,c,d,e"]
末尾1件を除外
["a","b","c","d"]
1扱い
["a,b,c,d,e"]
04 USE CASES 実務ユースケース別テンプレートコード集 CSV処理・URLクエリ解析・電話番号分割など
4-1. CSVデータを1行ずつ・カラムごとに分割する
$csv_text = "田中,28,東京\n鈴木,34,大阪\n佐藤,45,福岡";
// まず改行で行に分割
$rows = explode("\n", $csv_text);
$result = [];
foreach ($rows as $row) {
// 各行をカンマでカラムに分割
$cols = explode(",", $row);
$result[] = [
'name' => $cols[0],
'age' => (int)$cols[1],
'city' => $cols[2],
];
}
print_r($result);
// [
// ['name' => '田中', 'age' => 28, 'city' => '東京'],
// ['name' => '鈴木', 'age' => 34, 'city' => '大阪'],
// ['name' => '佐藤', 'age' => 45, 'city' => '福岡'],
// ]
上記のシンプルな例はデータにカンマ自体が含まれない前提です。「値の中にカンマやダブルクォートが含まれる本物のCSVファイル」を扱う場合は、explode()ではなくPHP標準のfgetcsv()(ファイルから読む)やstr_getcsv()(文字列から読む)を使うと、クォート内のカンマを正しく無視して解析できます。
4-2. URLのクエリパラメータを解析する
$url = "https://example.com/search?keyword=AI&page=2&sort=new";
// "?" で分割してクエリ文字列部分を取得(limit=2で1回だけ分割)
[$base, $query] = explode("?", $url, 2);
// クエリ文字列を "&" で分割
$pairs = explode("&", $query);
$params = [];
foreach ($pairs as $pair) {
[$key, $value] = explode("=", $pair, 2);
$params[$key] = urldecode($value);
}
print_r($params);
// ['keyword' => 'AI', 'page' => '2', 'sort' => 'new']
// ※実務では自作せず parse_str() / parse_url() を使うのが安全
parse_str($query, $params2); // 同じ結果がより安全に得られる
4-3. 電話番号・郵便番号をハイフンで分割する
$phone = "03-1234-5678";
[$area, $exchange, $number] = explode("-", $phone);
// $area = "03", $exchange = "1234", $number = "5678"
// ハイフンなしの番号にも対応させたい場合は事前に正規化
$raw = str_replace("-", "", $phone); // "0312345678"
4-4. メールアドレスをローカル部とドメインに分割する
$email = "user@example.com";
[$local, $domain] = explode("@", $email, 2);
echo $local; // "user"
echo $domain; // "example.com"
// 注意: メールアドレスの仕様上「@」はローカル部にクォート付きで
// 含まれる可能性があるため、limit=2を必ず指定して2個目以降の
// "@"で誤分割しないようにする
📚 用語解説
list()による分割代入:PHP 7.1以降、[$a, $b] = explode(...) のように配列を複数の変数へ一括で代入できる(list()構文の短縮記法)。explode()の結果をいちいち$result[0]、$result[1]と書かずに済むため、可読性が大きく向上する。要素数が足りない場合は該当変数にnullが入り、Notice(警告)が出る点に注意。
05 PITFALLS explode()使用時によくある落とし穴 空文字列の区切り文字・区切り文字が存在しない場合の挙動
explode("", $str) のように第1引数(区切り文字)に空文字列を渡すと、PHP 8系ではValueError(例外)が発生します(PHP 7系ではWarningを出したうえでfalseを返す仕様でした)。「1文字ずつ配列にしたい」場合はexplode()ではなくstr_split()を使いましょう。
// NG例(PHP 8系ではエラーになる)
explode("", "Hello");
// PHP Fatal error: Uncaught ValueError: explode(): Argument #1 ($separator) cannot be empty
// 正しい方法:1文字ずつ分割したい場合は str_split()
str_split("Hello");
// ["H", "e", "l", "l", "o"]
5-1. 区切り文字が文字列内に存在しない場合
$str = "HelloWorld"; // カンマが含まれない
$result = explode(",", $str);
print_r($result);
// Array ( [0] => HelloWorld )
// ※ エラーにはならず、元の文字列を1要素だけ持つ配列が返る
「区切り文字が実際に含まれているか」を先に知りたい場合は、explode()の結果の要素数(count())を見るか、str_contains($str, $separator)(PHP 8以降)で判定してからexplode()する方法が分かりやすいです。count(explode($sep, $str)) === 1 であれば、その区切り文字は文字列中に存在しません。
5-2. 空の要素が生まれるケース(連続する区切り文字)
$str = "a,,b,,,c"; // カンマが連続している
$result = explode(",", $str);
print_r($result);
// Array
// (
// [0] => a
// [1] => ← 空文字列
// [2] => b
// [3] => ← 空文字列
// [4] => ← 空文字列
// [5] => c
// )
// 空要素を除去したい場合は array_filter() と組み合わせる
$clean = array_filter($result, fn($v) => $v !== '');
// 空文字列の要素だけ除去(キーは詰め直されない点に注意)
$clean = array_values($clean); // キーを0始まりに振り直す
array_filter($array) を第2引数(コールバック)なしで使うと、空文字列だけでなく "0" や 0、false、null も除去されてしまいます。「本当に空文字列だけ除去したい」場合は、本文のコード例のように fn($v) => $v !== '' のような明示的な比較を使うのが安全です。
06 ALTERNATIVES preg_split・str_split・explodeを使い分ける 3つの分割関数の特性を比較し、適材適所で選ぶ
文字列を分割する関数はexplode()だけではありません。用途に応じてpreg_split()(正規表現)やstr_split()(固定長)を使い分けることで、より少ないコードで正確な処理ができます。
| 関数 | 分割の基準 | 正規表現 | 代表的な用途 |
|---|---|---|---|
| explode() | 固定文字列(区切り文字) | × 不可 | カンマ・改行・タブなど、区切り文字が1種類のとき |
| preg_split() | 正規表現パターン | ○ 可能 | 「カンマまたはセミコロン」など複数パターンで分割したいとき |
| str_split() | 固定文字数ごと | × 不可 | 「N文字ごとに区切りたい」(区切り文字がない)とき |
| strtok() | 複数の区切り文字(1文字ずつ) | × 不可 | トークンを1つずつ逐次取り出したいとき(やや古い書き方) |
6-1. preg_split():複数パターンで分割したいとき
// カンマ・セミコロン・全角読点のどれでも分割したい
$str = "リンゴ,バナナ;ミカン、ブドウ";
$fruits = preg_split('/[,;、]/u', $str);
print_r($fruits);
// ["リンゴ", "バナナ", "ミカン", "ブドウ"]
// 連続する空白(半角・全角混在)をまとめて1つの区切りとして分割
$text = "単語1 単語2\t\t単語3";
$words = preg_split('/\s+/', $text);
// ["単語1", "単語2", "単語3"]
📚 用語解説
preg_split():正規表現パターンに一致する部分を区切り文字として文字列を分割するPHP関数。explode()が固定の1パターンしか扱えないのに対し、preg_splitは「カンマまたはセミコロン」のような複数条件や、「1つ以上の空白」のような可変長のパターンにも対応できる。ただし正規表現の分だけexplode()より処理が重い。
6-2. str_split():固定文字数ごとに区切りたいとき
// 区切り文字が存在しないデータをN文字ごとに分割
$code = "ABCDEFGHIJ";
$chunks = str_split($code, 3);
print_r($chunks);
// ["ABC", "DEF", "GHI", "J"](最後は端数)
// クレジットカード番号を4桁ごとに区切って表示(実際の決済処理には使わない、表示用途のみ)
$masked = "1234567890123456";
$groups = str_split($masked, 4);
echo implode(" ", $groups); // "1234 5678 9012 3456"
6-3. どれを選ぶべきか判断フロー
1種類だけ?
Yes → explode()
可変長で分割?
Yes → preg_split()
なくN文字ごと?
Yes → str_split()
まずexplode()で
試すのが基本
07 IMPLODE 逆操作implode()との組み合わせ 配列を文字列に戻す・explode+implodeの実務パターン
explode()の逆操作にあたるのがimplode()(エイリアス: join())です。配列の要素を指定した区切り文字で連結し、1つの文字列に戻します。explode()とimplode()を組み合わせることで、「分割して加工し、また結合する」という実務パターンが実現できます。
// implode(区切り文字, 配列): array → string
$arr = ["田中", "28", "東京"];
echo implode(",", $arr);
// "田中,28,東京"
// explode + implode の組み合わせ例:
// 「カンマ区切り」を「パイプ区切り」に変換する
$csv_line = "田中,28,東京";
$converted = implode("|", explode(",", $csv_line));
echo $converted;
// "田中|28|東京"
// 配列の要素を加工してから再結合する
$names = "tanaka,suzuki,sato";
$capitalized = implode(",", array_map('ucfirst', explode(",", $names)));
echo $capitalized;
// "Tanaka,Suzuki,Sato"
📚 用語解説
implode() / join():配列の各要素を指定した区切り文字で連結し、1つの文字列として返す関数。explode()の逆操作にあたる。join()はimplode()の別名(エイリアス)で、内部的にはまったく同じ関数。どちらを使ってもよいが、PHP公式マニュアルではimplode()の表記が主に使われている。
CSVの特定カラムだけ変換したい、URLのパスを一部差し替えたい、といった「文字列の一部だけ書き換えたい」場面では、①explode()で配列化 → ②array_map()やforeachで加工 → ③implode()で再結合、という3ステップが定番の書き方です。正規表現でゴリ押しするより可読性が高くなることが多いです。
08 NO-CODE APPROACH 【独自】非エンジニアがコードを1行も書かずにデータ処理する方法 PHPの構文を覚えなくても、Claude Codeに指示するだけでよい
ここまでexplode()の構文・limit引数・落とし穴・関連関数まで技術的に詳しく解説してきましたが、正直なところ「PHPのコードを自分で書きたいわけではない」という経営者・管理職の方も多いはずです。
実際、explode()のlimit引数の挙動や、preg_splitとの使い分けを暗記する必要はありません。Claude Codeに日本語で「やりたいこと」を伝えるだけで、適切な関数を選んでコードを書いてくれます。
| やりたいこと | Claude Codeへの指示例 |
|---|---|
| CSVを配列に変換したい | 「このカンマ区切りのテキストを、1行ずつ・カラムごとに分けた配列に変換するPHPコードを書いて。値にカンマが含まれる可能性があるので安全な方法で」 |
| 最初の区切りだけ分割したい | 「"key=value=with=equals" のような文字列から、最初の"="だけで区切ってkeyとvalueに分けるPHPコードを書いて」 |
| 複数の区切り文字に対応したい | 「カンマ・セミコロン・読点のどれで区切られていても分割できるPHPコードを書いて」 |
| 既存コードの不具合修正 | 「このPHPコードでexplode()を使っているが、区切り文字が空文字列になるケースでエラーになる。安全な書き方に直して」 |
やりたい処理を
日本語で伝える
Claude Codeが
PHPコードを生成
実データで
動作確認
edge caseを
追加で指示
ポイントは、入力例と期待する出力例をセットで伝えることです。「"2026-09-10" というテキストを年・月・日に分けたい」のように具体例を添えるだけで、Claude Codeは適切な関数(このケースならexplode)を自分で選んで実装してくれます。
Claude Codeが生成するコードは高い精度で動作しますが、「値にカンマが含まれるCSV」「改行コードが混在したファイル」など、実際の業務データには想定外のパターンが混じることがあります。本番投入前に、実データのサンプルで一度動作確認する工程は省略しないことをおすすめします。
09 GENAI CASE STUDY 【独自データ】GENAI社内のデータ処理業務とClaude Code活用 Max 20xプランを契約する会社が、実際に何を任せているか
弊社(株式会社GENAI)では、Claude Max 20xプラン(月額$200・約30,000円)を契約し、経営・営業・広告・開発・経理・秘書業務まで社内のあらゆる業務にClaude Codeを組み込んでいます。ここでは、今回のテーマであるデータ整形・文字列処理に近い業務でのClaude Code活用の実態を紹介します。
| 業務領域 | 主な用途(データ整形系) | 概算の変化 |
|---|---|---|
| 経理 | 請求書CSVの取り込み・カラム整形・Freee連携用フォーマット変換 | 月40時間 → 月5時間(肌感) |
| 広告運用 | 広告媒体からエクスポートしたレポートCSVの集計・成形 | 週10時間 → 週1時間(肌感) |
| 営業 | 顧客リスト(CSV/スプレッドシート)の名寄せ・重複除去 | 都度数時間の短縮(肌感) |
| 開発 | フォーム入力値の正規化処理・簡易スクリプトの書き捨て | 都度数時間の短縮(肌感) |
上記は弊社の肌感ベースの概算であり、業種・業態・担当者のスキルによって変動します。「完全自動化」ではなく、人間によるレビュー・微調整を前提とした数値です。
こうした業務に共通するのは、「本質的にはexplode()やimplode()、正規表現の組み合わせで解決できる処理」だという点です。以前はエンジニアに依頼するか、Excelで手作業をしていた領域を、今ではClaude Codeへの日本語指示だけでスクリプト化できるようになりました。
10 CONCLUSION まとめ explode()の要点とClaude Code活用のポイントを振り返る
explode()自体はシンプルな関数ですが、limit引数や落とし穴まで含めて正しく理解しておくと、CSV処理やAPIレスポンスの整形など、実務での応用範囲は非常に広くなります。
一方で、こうした細かい構文を覚えること自体が目的ではありません。「業務のどのデータをどう加工したいか」を明確に言語化できれば、実装はClaude Codeに任せられる時代になっています。弊社では、このような業務システムのデータ処理・自動化設計の支援を行っています。
PHPを含む業務データの処理・自動化を、AI鬼管理が一緒に設計します
explode()のようなPHPの構文知識より、業務でどのデータをどう自動処理するかの方が重要です。
AI鬼管理では、CSV・スプレッドシート・基幹システムのデータ連携までAI活用・自動化設計を支援しています。
ここから先の進め方は、大きく2つあります。
自社で回せるようになりたい方は、AI鬼管理でClaude Code/Codexの使い方から業務設計・社内定着まで伴走を受けながら、社内に仕組みを作る道があります。
覚えるより任せたい方は、AI社員AIKATAでこの記事のような定型業務を丸ごと預ける道があります。料金は月30万円の月額定額、追加費用は0円です。
どちらが合うかは、業務量と社内体制次第です。無料相談・無料適合診断で、貴社の場合はどちらが向くかからご相談いただけます。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
よくある質問
Q. explode()の区切り文字は複数文字でも指定できますか?
A. はい、指定できます。explode(",", $str) のように1文字を指定するのが一般的ですが、explode("::", $str) のように複数文字の文字列を区切り文字として指定することも可能です。文字列中で"::"という並びが登場した箇所すべてで分割されます。
Q. explode()の結果が空配列になることはありますか?
A. 分割対象の文字列(第2引数)が空文字列 "" の場合、explode()は要素数1・値が空文字列の配列([""])を返します。完全な空配列(要素数0)が返ることは基本的にありません。limitに負の数を指定し、除外する数が元の要素数以上になった場合も、要素数0の空配列が返ります。
Q. explode()とpreg_split()、どちらの方が処理が速いですか?
A. 区切り文字が固定文字列で済む場合はexplode()の方が高速です。preg_split()は正規表現エンジンを呼び出すオーバーヘッドがあるため、単純な分割であればexplode()を優先するのが基本方針です。正規表現が必要なケース(複数パターン・可変長の区切り)でのみpreg_split()を使いましょう。
Q. explode()で分割した結果の空白(半角スペース)を除去したいです。
A. explode()自体にはトリム機能はないため、array_map("trim", $array)と組み合わせるのが一般的です。例: array_map("trim", explode(",", "a, b , c")) で ["a", "b", "c"] のように前後の空白を除去できます。
Q. マルチバイト文字(日本語)を含む文字列でもexplode()は正しく動きますか?
A. はい、区切り文字がASCII文字(カンマ・スラッシュなど)であれば、値に日本語が含まれていても問題なく分割できます。explode()はバイト単位ではなく区切り文字の一致箇所で分割するため、UTF-8の日本語文字列でも文字化けや破損は起きません。ただし区切り文字自体を全角文字(例: "、")にする場合は、文字列全体がUTF-8で統一されているか確認しておくと安全です。
Q. Claude CodeにPHPのデータ処理コードを書いてもらうとき、どんな指示が効果的ですか?
A. ①元のデータ形式(例: "カンマ区切りのCSV、1行1レコード")、②入力例と期待する出力例、③edge case(例: "値にカンマが含まれる場合がある")、④使ってほしい/使ってほしくない関数(例: "fgetcsvを使って")の4点をセットで伝えると、実務でそのまま使える精度のコードが一度で返ってくることが多いです。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理/AI社員AIKATAへのお問い合わせ
この記事を読んで気になった方へ。
専門スタッフが、御社に最適な
業務自動化・業務代行プランを無料でご提案します。




