- カテゴリ: PHP
- 対応バージョン: Laravel 11・12・PHP 8.2(※指定なしのため既定を採用)
- 名前空間 / FQCN / コマンド: グローバル関数
implode - 関連: explode / join / array_map / Arr::join(Laravel) / Collection::implode(Laravel)
- 変更履歴: 歴史的経緯により「配列→区切り」の逆順引数も許容されるが、可読性のため
implode(string $separator, array $array)順を推奨
要点(TL;DR)
- 配列の要素を区切り文字でつないで1つの文字列にする。
- 最低限:
implode(',', ['a', 'b', 'c']) // "a,b,c" - 罠: 引数順の取り違え/ネスト配列は連結不可(”Array”に化け警告)/
null区切りは型エラー
概要
implode は配列の要素を任意の区切り文字(セパレータ)で連結し、文字列を生成します。CSV行の生成、ログ文の整形、SQLプレースホルダの並び作成などに頻出します。Laravelプロジェクトでも、配列を最終的に文字列で保存・表示する場面で基本手段として使います。
構文 / シグネチャ
string implode(string $separator, array $array);
// 歴史的に以下も許容される(非推奨):
// string implode(array $array, string $separator = "");
引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| $separator | string | いいえ | '' | 要素間に挿入する区切り文字 |
| $array | array | はい | なし | 連結対象の配列(各要素は文字列に変換可能であること) |
- 戻り値:
string— 連結された文字列 - 例外/副作用:不正な型の場合
TypeError。要素に配列など文字列化できない値が混ざると「Array to string conversion」等の警告が発生し意図しない結果になることがある。
使用例
最小例
<?php
declare(strict_types=1);
$line = implode(',', ['id', 'name', 'email']); // "id,name,email"
echo $line . PHP_EOL;
// 区切りなし
echo implode(['A', 'B', 'C']); // "ABC"(逆順引数は非推奨)
実務例(SQLプレースホルダ/CSV生成/例外扱い)
<?php
declare(strict_types=1);
// 1) SQLのIN句用の "?, ?, ?" を作る
$ids = [10, 20, 30];
$placeholders = implode(', ', array_fill(0, count($ids), '?')); // "?, ?, ?"
// 2) CSV 1行の生成(カンマやダブルクオートを含む値に対応)
$values = ['ACME, Inc.', 'He said "Hi"', "O'Reilly"];
$escaped = array_map(fn ($v) => '"' . str_replace('"', '""', (string)$v) . '"', $values);
$csvLine = implode(',', $escaped); // "ACME, Inc.","He said ""Hi""","O'Reilly"
// 3) 型エラーを補足(区切りに null を渡さない)
try {
// @phpstan-ignore-next-line
$bad = implode(null, ['a', 'b']); // PHP 8+: TypeError
} catch (TypeError $e) {
error_log('implode error: ' . $e->getMessage());
}
実務例(Laravel:Collectionと併用)
<?php
declare(strict_types=1);
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
// タグ名コレクションを "A, B, C" で表示
$tags = collect([['name' => 'A'], ['name' => 'B'], ['name' => 'C']]);
$tagList = $tags->pluck('name')->implode(', '); // "A, B, C"
// 最後だけ別の区切り(Oxford comma 相当)
$fruits = ['Apple', 'Banana', 'Cherry'];
$natural = Arr::join($fruits, ', ', ' and '); // "Apple, Banana and Cherry"
よくある落とし穴・注意
- 引数順の取り違え:
implode($array, $separator)も動くが可読性が悪い。常にimplode($separator, $array)を使う。 - ネスト配列は不可:要素に配列が混ざると警告が出て
"Array"という文字になる。array_mapで文字列化するか、事前にフラット化する。 - 区切りに
nullを渡さない:string型必須。nullはTypeError。空区切りにしたいなら''を渡す。 - オブジェクト要素:
__toString()を実装していないオブジェクトは文字列化できず警告・エラー。必要ならarray_map(fn($o) => (string)$o, $arr)。 - エンコーディング:
implodeは結合するだけ。UTF-8/Shift-JIS 混在は文字化けの原因。事前に揃える。
代替・関連APIとの比較
join(PHP):implodeのエイリアス。意味は同じ。プロジェクトでどちらかに統一推奨。Collection::implode(Laravel):コレクションのキーやクロージャ指定での連結に便利。配列→コレクション→implodeの流れで表現力が上がる。Arr::join(Laravel):最後の要素だけ別の区切りを使う文語的出力に最適(例: 「A, B and C」)。explode(PHP):文字列→配列の逆変換。入出力の向きで使い分ける。
テスト例(Pest)
<?php
it('joins with separator', function () {
expect(implode('-', [2025, 8, 30]))->toBe('2025-8-30');
});
it('joins without separator', function () {
expect(implode(['A', 'B', 'C']))->toBe('ABC');
});
it('throws on non-string separator', function () {
// @phpstan-ignore-next-line
implode(null, ['x', 'y']); // PHP 8+: TypeError
})->throws(TypeError::class);
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
implode(): Argument #2 ($array) must be of type array, string given | 引数順の取り違え(文字列を第2引数へ渡した) | implode($separator, $array) の順に修正 |
Array to string conversion(警告) | 要素に配列が混ざっている | 事前にフラット化/適切な array_map('strval', ...) を行う |
Object of class Foo could not be converted to string | __toString() のないオブジェクトを要素に含めた | 文字列化処理を用意するか、対象を取り除く |
| 想定外の文字化け | 文字コード混在のまま結合 | 入力を同一エンコーディング(例: UTF-8)に統一してから実行 |
| 最後だけ「と」で結びたい | implode は同一区切りのみ | Laravelの Arr::join($arr, ', ', ' と ') を使用 |
参考リンク
- PHP Manual — implode
https://www.php.net/manual/en/function.implode.php - PHP Manual — join(エイリアス)
https://www.php.net/manual/en/function.join.php - Laravel — Collections(
implode/join)
https://laravel.com/docs/11.x/collections - Laravel — Arr ヘルパ(
Arr::join)
https://laravel.com/docs/11.x/helpers#method-array-join

