PHP Tips | 文字列処理:入力補助 - 配列 → カンマ区切り文字列

PHP PHP
スポンサーリンク

何をしたいユーティリティなのか

「配列 → カンマ区切り文字列」は、その名の通り、

['apple', 'orange', 'banana']
PHP

を、

"apple,orange,banana"
PHP

のような「1 本の文字列」に変換するユーティリティです。

業務だと、こういう場面でよく使います。

  • DB に「カンマ区切り文字列」として保存したい
  • 管理画面のテキストボックスに「カンマ区切りで表示」したい
  • 外部 API に「カンマ区切りの ID リスト」を渡したい

毎回 implode(',', $array) と書いてもいいのですが、 実務では「空要素」「重複」「前後の空白」などを整えてから文字列化したほうが、後々トラブルが減ります。

素朴な implode の挙動を知る

implode(‘,’, $array) の基本

PHP には implode という関数があります。

$items = ['apple', 'orange', 'banana'];

$str = implode(',', $items);

echo $str; // apple,orange,banana
PHP

これはとてもシンプルで、「配列の要素を区切り文字でつなぐ」関数です。 ただし、そのまま使うと、こういうケースで困ります。

$items = ['apple', '', 'orange', '  banana  ', null];

$str = implode(',', $items);

echo $str; // apple,,orange,  banana  ,
PHP

問題点がいくつか見えます。

  • 空文字のところで「連続カンマ」ができている
  • banana の前後の空白がそのまま残っている
  • null が空文字として扱われて末尾にカンマだけ残っている

業務で使うときは、ここをきれいに整えてから文字列化したいですよね。

基本方針:「文字列化 → トリム → 空要素除去 → 重複除去 → implode」

やりたいことを順番に並べる

配列を「実務で使えるカンマ区切り文字列」にするには、 だいたい次のステップを踏みます。

  1. 各要素を文字列として扱える形にする((string) キャストなど)
  2. 各要素の前後の空白を trim で削る
  3. 空文字("")になった要素は捨てる
  4. 必要なら重複を消す
  5. 最後に implode(',', $array) でつなぐ

これを毎回手書きするのではなく、 1 本のユーティリティ関数にまとめておくのが賢いやり方です。

実装例:配列 → カンマ区切り文字列

コアとなる関数

function join_with_comma(array $items, bool $unique = false): string
{
    $normalized = [];

    foreach ($items as $item) {
        // まず文字列にキャスト
        $value = (string)$item;

        // 前後の空白を削る
        $value = trim($value);

        // 空文字はスキップ
        if ($value === '') {
            continue;
        }

        $normalized[] = $value;
    }

    // 重複を消したい場合
    if ($unique) {
        $normalized = array_values(array_unique($normalized));
    }

    // 要素がなければ空文字を返す
    if ($normalized === []) {
        return '';
    }

    // カンマで結合
    return implode(',', $normalized);
}
PHP

ここでの重要ポイントは 4 つです。

  • どんな値でも (string) で文字列化していること
  • 各要素に対して trim をかけていること
  • 空文字は結果に入れないこと
  • オプションで重複を消せるようにしていること

これで、「空要素」「余計な空白」「重複」をきれいに吸収できます。

例題で挙動を確認する

シンプルな配列

$items = ['apple', 'orange', 'banana'];

echo join_with_comma($items);
// apple,orange,banana
PHP

期待通りですね。

空文字や null が混ざる場合

$items = ['apple', '', 'orange', null, 'banana'];

echo join_with_comma($items);
// apple,orange,banana
PHP

空文字と null はスキップされているので、 連続カンマや末尾の余計なカンマはできません。

前後に空白がある場合

$items = [' apple ', 'orange  ', '  banana  '];

echo join_with_comma($items);
// apple,orange,banana
PHP

各要素の trim によって、 前後の空白がきれいに削られています。

重複を消したい場合

$items = ['apple', 'orange', 'apple', 'banana', 'orange'];

echo join_with_comma($items, true);
// apple,orange,banana
PHP

$unique = true にすると、 array_unique によって重複が取り除かれます。

実務での使いどころ

DB に「カンマ区切り文字列」として保存する

例えば、ユーザーが選んだタグを配列で持っていて、 それを 1 カラムに「カンマ区切り文字列」として保存したいケースです。

$tags = ['php', 'backend', 'utility', 'php'];

$tagsStr = join_with_comma($tags, true);

// 例: users.tags カラムに保存
// php,backend,utility
PHP

保存するときに重複を消しておけば、 後で読み出しても扱いやすくなります。

管理画面のテキストボックスに表示する

「カンマ区切りで編集できる」テキストボックスを用意したいとき、 配列から文字列に戻すのに使えます。

$emails = ['user1@example.com', 'user2@example.com', 'user3@example.com'];

$valueForInput = join_with_comma($emails);

// <input type="text" value="user1@example.com,user2@example.com,user3@example.com">
PHP

ユーザーが編集した文字列は、 前に作った「カンマ区切り文字列 → 配列」ユーティリティでまた配列に戻せます。

もう一歩:スペース付きのフォーマットにしたい場合

「カンマ+スペース」で見やすくしたい

人間が読むときには、"apple, orange, banana" のように 「カンマ+スペース」で区切られていたほうが見やすいことも多いです。

その場合は、区切り文字を ', ' に変えるだけです。

function join_with_comma_and_space(array $items, bool $unique = false): string
{
    $normalized = [];

    foreach ($items as $item) {
        $value = trim((string)$item);

        if ($value === '') {
            continue;
        }

        $normalized[] = $value;
    }

    if ($unique) {
        $normalized = array_values(array_unique($normalized));
    }

    if ($normalized === []) {
        return '';
    }

    return implode(', ', $normalized);
}
PHP

使い方の例です。

$items = ['apple', 'orange', 'banana'];

echo join_with_comma_and_space($items);
// apple, orange, banana
PHP

「人間向けの表示」としては、こちらのほうが読みやすいですね。

まとめ:今日からの「配列 → カンマ区切り文字列」ユーティリティ

このユーティリティの本質は、「雑な配列を、きれいなカンマ区切り文字列に整えてあげる」ことです。

そのために、

  • 各要素を文字列化する
  • 前後の空白を trim する
  • 空文字は捨てる
  • 必要なら重複を消す
  • 最後に implode(',', ...) でつなぐ

という処理を 1 本の関数に閉じ込めておきます。

もう一度、基本形を載せておきます。

function join_with_comma(array $items, bool $unique = false): string
{
    $normalized = [];

    foreach ($items as $item) {
        $value = trim((string)$item);

        if ($value === '') {
            continue;
        }

        $normalized[] = $value;
    }

    if ($unique) {
        $normalized = array_values(array_unique($normalized));
    }

    if ($normalized === []) {
        return '';
    }

    return implode(',', $normalized);
}
PHP

もし、あなたのコードのどこかで「implode(',', $array) をそのまま使っている」箇所があれば、 そこをこのユーティリティに差し替えてみてください。 空要素や余計な空白、重複に悩まされることが、かなり減ります。

タイトルとURLをコピーしました