- カテゴリ: collection
- 掲載バージョン: Laravel 12・PHP 8.4
- 名前空間 / FQCN / コマンド:
Illuminate\Support\Collection::implode - 関連: Collection::join / Collection::pluck / Collection::map / Collection::reduce / Arr::join
- 変更履歴: 2形態の呼び出し(
implode($glue)とimplode($value, $glue))をサポート
要点(TL;DR)
- コレクションの要素を区切り文字で結合して1つの文字列にする
collect([1,2,3])->implode(',') // "1,2,3"- 罠:配列/オブジェクト要素はキー名またはクロージャを渡さないと空になる/
joinは終端だけ別の区切りを使える
概要
implode はコレクションの最終段として、全要素を文字列にまとめます。要素がスカラ値(文字列・数値)ならそのまま結合、配列やオブジェクトなら「どの値を使うか」をキー名またはクロージャで指定します。レポート出力、ヘッダー生成、SQL用のID列整形などで頻用します。
構文 / シグネチャ
string implode(string $glue); // 要素がそのまま文字列化できる場合
string implode(string|callable $value, string $glue = ''); // 配列/オブジェクト要素から値を抜き出して結合
- 引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| glue | string | 〇 | 連結の区切り文字。前者形態では唯一の引数 | |
| value | string | callable | 〇* | 配列/オブジェクト要素から取り出すキー名、または fn($item, $key) => string | |
| glue(2形態目) | string | 〇 | '' | 2形態目の区切り文字 |
- 戻り値:
string連結済みの文字列 - 例外/副作用:特になし(クロージャ内で投げた例外は伝播)
使用例
最小例
<?php
use Illuminate\Support\Collection;
echo collect([1, 2, 3])->implode(','); // "1,2,3"
echo collect(['a', 'b', 'c'])->implode('-'); // "a-b-c"
実務例
<?php
use App\Models\User;
use Illuminate\Support\Collection;
// 1) ユーザー名をCSVで
$namesCsv = User::active()->pluck('name')->implode(','); // "Alice,Bob,Carol"
// 2) 配列/オブジェクトからキー名で取り出して結合
$rows = collect([
['id' => 10, 'name' => 'A'],
['id' => 11, 'name' => 'B'],
]);
$ids = $rows->implode('id', ','); // "10,11"
// 3) クロージャで自由整形("id:name" を ; 区切り)
$pair = $rows->implode(fn ($row) => "{$row['id']}:{$row['name']}", ';'); // "10:A;11:B"
// 4) HTTPヘッダーやSQL IN 句
$accept = collect(['text/html', 'application/json'])->implode(', '); // "text/html, application/json"
$inClause = '(' . $rows->implode('id', ',') . ')'; // "(10,11)"
よくある落とし穴・注意
- 配列/オブジェクト要素:
collect([['id'=>1]])->implode(',')は空文字に。implode('id', ',')かクロージャで指定する。 joinとの違い:joinは終端だけ別の区切り(例:"A, B and C")を使えるが、implodeは全て同じ区切り。- チェーン性:返り値は文字列。以降のコレクションメソッドは使えない(最終段に置く)。
- キーは無視:連結対象は値のみ。連想キーは保持されない。
- 性能:O(n)。
LazyCollectionでも利用可だが、最終的に全件を走査して文字列化される。
代替・関連APIとの比較
- Collection::join:末尾だけ別の区切りを使える自然文向け(例:「A, B と C」)。
- Collection::pluck:まず必要なフィールドを抜き出し→
implode。配列/オブジェクト要素の定番コンボ。 - Arr::join / PHPの
implode():配列操作だけならこれらでも可。コレクションのまま扱うなら本メソッドが自然。
テスト例(Pest)
<?php
use Illuminate\Support\Collection;
it('joins scalar items with glue', function () {
expect(collect([1, 2, 3])->implode(','))->toBe('1,2,3');
});
it('joins array items by key with glue', function () {
$rows = collect([['id'=>10], ['id'=>11]]);
expect($rows->implode('id', ','))->toBe('10,11');
});
it('joins via closure', function () {
$rows = collect([['id'=>10,'name'=>'A'], ['id'=>11,'name'=>'B']]);
$s = $rows->implode(fn ($r) => "{$r['id']}:{$r['name']}", ';');
expect($s)->toBe('10:A;11:B');
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
| 出力が空文字になる | 要素が配列/オブジェクトで、value を指定していない | implode('キー名', ',') またはクロージャを使う |
Call to undefined method implode | PHP配列に対してコレクションメソッドを呼んでいる | collect($array)->implode(',') または implode(',', $array) |
| 区切りが末尾だけ変えられない | implode は全区切りが同一 | join(',', ' and ') を使う |
| さらにコレクション操作を続けたい | implode は文字列を返す | 文字列にしたくない段階では呼ばず、最後に呼ぶ |
コレクション特記事項
- チェーン可否:不可(文字列を返すため最終段で使用)
- 破壊的/非破壊:非破壊
- キー保持:しない(値のみ連結)
- LazyCollection:利用可(ただし最終的に全件を走査)
- 計算量の目安:O(n)
- 入出力対応の小サンプル
| 入力要素 | 呼び方 | 出力 |
|---|---|---|
['a','b'] | implode(',') | "a,b" |
[['id'=>1],['id'=>2]] | implode('id', ',') | "1,2" |
[(object)['n'=>1], (object)['n'=>2]] | implode('n', ',') | "1,2" |
| 任意構造 | implode(fn($x) => transform($x), ';') | transform() の結果を連結 |
参考リンク
- Laravel Docs — Collections: Method: implode(公式)
https://laravel.com/docs/12.x/collections#method-implode - Laravel Docs — Collections: Method: join(公式)
https://laravel.com/docs/12.x/collections#method-join - PHP Manual — implode(標準PHP)
https://www.php.net/manual/en/function.implode.php
