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

PHP PHP
スポンサーリンク

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

「カンマ区切り文字列 → 配列」は、 例えばこんな入力を、

"apple,orange,banana"

こういう配列に変換するユーティリティです。

["apple", "orange", "banana"]

CSV 風の入力、ID の一覧、メールアドレスの複数指定など、 「カンマで区切って複数指定したい」場面は業務でめちゃくちゃ多いです。

毎回 explode(',', ...) と書いてもいいのですが、 実務では「前後の空白」「連続カンマ」「末尾のカンマ」など、地味な罠がたくさんあります。 それを一気に吸収してくれるのが、このユーティリティです。

素朴な explode の問題点を知る

explode(‘,’) だけだと困るケース

まずは、素朴な書き方を見てみます。

$input = 'apple,orange,banana';

$parts = explode(',', $input);

var_dump($parts);
PHP

これは期待通りです。

array(3) {
  [0] => "apple"
  [1] => "orange"
  [2] => "banana"
}
PHP

でも、現実の入力はもっと雑です。

$input = 'apple, orange ,  banana ,';

$parts = explode(',', $input);

var_dump($parts);
PHP

結果はこうなります。

array(4) {
  [0] => "apple"
  [1] => " orange "
  [2] => "  banana "
  [3] => ""
}
PHP

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

  • 各要素の前後に空白が残っている
  • 末尾のカンマで「空文字」ができている

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

基本方針:「分割 → トリム → 空要素除去」

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

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

  1. explode(',', $input) でいったん分割する
  2. 各要素の前後の空白を trim で削る
  3. 空文字("")になった要素は捨てる

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

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

コアとなる関数

function split_by_comma(string $input): array
{
    // 全体の前後の空白を削る
    $input = trim($input);

    // そもそも空なら空配列
    if ($input === '') {
        return [];
    }

    // まずカンマで分割
    $rawParts = explode(',', $input);

    $result = [];

    foreach ($rawParts as $part) {
        // 各要素の前後の空白を削る
        $value = trim($part);

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

        $result[] = $value;
    }

    return $result;
}
PHP

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

  • 最初に trim して、全体の前後の空白を落としていること
  • 各要素に対しても trim をかけていること
  • 空文字は結果に入れないこと

これで、「末尾のカンマ」「連続カンマ」「前後の空白」などを、きれいに吸収できます。

例題で挙動を確認する

シンプルなカンマ区切り

$input = 'apple,orange,banana';

var_dump(split_by_comma($input));
PHP

結果はこうです。

array(3) {
  [0] => "apple"
  [1] => "orange"
  [2] => "banana"
}
PHP

期待通りですね。

前後に空白がある場合

$input = '  apple,orange,banana  ';

var_dump(split_by_comma($input));
PHP

結果はこうです。

array(3) {
  [0] => "apple"
  [1] => "orange"
  [2] => "banana"
}
PHP

全体の trim によって、前後の空白は無視されています。

各要素に空白が混ざる場合

$input = 'apple, orange ,  banana ,';

var_dump(split_by_comma($input));
PHP

結果はこうなります。

array(3) {
  [0] => "apple"
  [1] => "orange"
  [2] => "banana"
}
PHP

各要素の trim によって、 " orange "" banana " がきれいに "orange", "banana" になり、 末尾の空文字はスキップされています。

連続カンマがある場合

$input = 'apple,,orange,,,banana';

var_dump(split_by_comma($input));
PHP

結果はこうです。

array(3) {
  [0] => "apple"
  [1] => "orange"
  [2] => "banana"
}
PHP

連続カンマの間にできた空文字は、すべて捨てられています。

実務での使いどころ

ID の複数指定

管理画面などで、「対象ユーザー ID をカンマ区切りで入力してもらう」ケースがあります。

$rawIds = $_POST['user_ids'] ?? '';

$ids = split_by_comma($rawIds);

// 数値に変換しつつ、空や不正値を除去
$ids = array_map('intval', $ids);
$ids = array_filter($ids, fn($id) => $id > 0);
$ids = array_values(array_unique($ids));
PHP

ユーザーが、

"1, 2,3, 10,"

と入力しても、最終的には [1, 2, 3, 10] のようなきれいな配列になります。

メールアドレスの複数指定

通知設定などで、「複数のメールアドレスをカンマ区切りで入力してもらう」こともあります。

$rawEmails = $_POST['emails'] ?? '';

$emails = split_by_comma($rawEmails);

// 簡易的なバリデーション
$emails = array_filter($emails, fn($email) => filter_var($email, FILTER_VALIDATE_EMAIL));
$emails = array_values(array_unique($emails));
PHP

"user1@example.com, user2@example.com , , user3@example.com"

のような入力でも、 空文字や余計な空白を取り除いた配列にできます。

もう一歩:全角カンマも扱いたい場合

日本語入力の「,」問題

日本語環境では、ユーザーが「全角カンマ(,)」で区切ってくることがあります。

"apple,orange,banana"

これをそのまま explode(',', ...) にかけても、 全角カンマは区切りとして扱われません。

そこで、前処理で「全角カンマを半角にそろえる」こともできます。

function split_by_comma_jp(string $input): array
{
    // 全角カンマを半角に
    $input = str_replace(',', ',', $input);

    // あとはさっきと同じ
    $input = trim($input);

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

    $rawParts = explode(',', $input);

    $result = [];

    foreach ($rawParts as $part) {
        $value = trim($part);

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

        $result[] = $value;
    }

    return $result;
}
PHP

これで、

"apple, orange,banana"

も、きれいに ['apple', 'orange', 'banana'] に分割できます。

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

このユーティリティの本質は、「ユーザーが“なんとなくカンマで区切って入力したもの”を、きれいな配列にしてあげる」ことです。

そのために、

  • 全体を trim して前後の空白を落とす
  • explode(',', ...) でいったん分割する
  • 各要素を trim して、空文字は捨てる
  • 必要なら全角カンマも半角にそろえる

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

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

function split_by_comma(string $input): array
{
    $input = trim($input);

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

    $rawParts = explode(',', $input);

    $result = [];

    foreach ($rawParts as $part) {
        $value = trim($part);

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

        $result[] = $value;
    }

    return $result;
}
PHP

もし、あなたのコードのどこかで「explode(',', $_POST['ids'])」のような行があれば、 そこをこのユーティリティに差し替えてみてください。 前後の空白や余計なカンマに悩まされることが、かなり減ります。

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