implode — コレクション要素を文字列に連結

  • カテゴリ: 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 = '');     // 配列/オブジェクト要素から値を抜き出して結合
  • 引数(表)
引数必須既定値説明
gluestring連結の区切り文字。前者形態では唯一の引数
valuestring | 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 implodePHP配列に対してコレクションメソッドを呼んでいる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() の結果を連結

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする