implode — 配列要素を区切り文字で連結して文字列にする

PHP
  • カテゴリ: 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 = "");

引数(表)

引数必須既定値説明
$separatorstringいいえ''要素間に挿入する区切り文字
$arrayarrayはいなし連結対象の配列(各要素は文字列に変換可能であること)
  • 戻り値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 型必須。nullTypeError。空区切りにしたいなら '' を渡す。
  • オブジェクト要素__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, ', ', ' と ') を使用

参考リンク

レン (Wren)

こんにちは。レンです。

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

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

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

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

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

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