💡 今日の3行まとめ
  • カンマ区切りの文字列を配列に分割するときは explode(',', $text) を使う
  • array_map('trim', ...) と array_filter() で前後の空白と空要素を一掃する
  • array_unique() で重複タグを消し、implode() で見やすい文字列に再結合する

1. 今日のお題とゴール

ブログやSNSの投稿フォームで、ユーザーが入力したカンマ区切りのタグ文字列(" PHP, 初心者 , Web開発, PHP , ")を綺麗に整形して出力してみましょう。

  • カンマ(,)で分割し、各タグの前後の空白と空っぽの要素を取り除く
  • 同じタグ(PHP)が複数回入力されても1つだけにまとめる
  • 各タグの先頭に # を付けて半角スペース区切りで出力する
// 期待する出力結果
配列: ["PHP","初心者","Web開発"]
表示: #PHP #初心者 #Web開発

2. ❌ やりがちなNGコード vs ⭕ コピペで動く正解コード

❌ やりがちなNGコードBefore
<?php
$rawInput = " PHP, 初心者 , Web開発, PHP , ";
$tags = explode(',', $rawInput);

foreach ($tags as $tag) {
    echo "#" . $tag . " ";
}
// 出力: # PHP # 初心者  # Web開発 # PHP  # 

explode() で割っただけだと、余分なスペース・重複した PHP・末尾カンマによる空の # がそのまま出力されてしまいます。配列関数を順番に組み合わせて、入力の汚れをスッキリ落としましょう。

⭕ コピペで動く正解コード(PHP 8.3+)After
<?php
declare(strict_types=1);

$rawInput = " PHP, 初心者 , Web開発, PHP , ";

// 1. カンマで分割し、各要素の前後の空白を除去する
$splitTags = explode(',', $rawInput);
$trimmedTags = array_map('trim', $splitTags);

// 2. 空文字の要素を除外し、重複を取り除く
$nonEmptyTags = array_filter($trimmedTags, fn(string $tag): bool => $tag !== '');
$uniqueTags = array_values(array_unique($nonEmptyTags));

// 3. 先頭に「#」を付けてスペース区切りで結合する
$formattedTags = array_map(
    fn(string $tag): string => '#' . htmlspecialchars($tag, ENT_QUOTES, 'UTF-8'),
    $uniqueTags
);

echo '配列: ' . json_encode($uniqueTags, JSON_UNESCAPED_UNICODE) . PHP_EOL;
echo '表示: ' . implode(' ', $formattedTags) . PHP_EOL;

3. ここだけ押さえる!3つのポイント

1explode() と array_map('trim', ...) はセットで使う

explode(',', $rawInput) で文字列を配列に分割した直後は、要素の前後にスペースが残っています。array_map('trim', $splitTags) を通すことで、ループを書かずに全要素の空白を一括除去できます。

2空文字の除去は !== '' で厳密に判定する

コールバックなしの array_filter() を使うと、"0" という名前のタグまで「空」とみなされて消えてしまいます。アロー関数 fn(string $tag): bool => $tag !== '' を指定して、空文字だけを安全に取り除きましょう。

3array_unique() のあとは array_values() で連番に戻す

array_unique() や array_filter() を通すと、配列の添字(インデックス)が 0, 1, 2... ではなく歯抜けになります。array_values() で添字を振り直しておくと、JSON出力や添字アクセスでのバグを防げます。

4. 1分ミニチャレンジ

🚀 手を動かしてみよう

スマホから入力するユーザーは、半角カンマ(,)ではなく読点(、)で区切ってしまうことがあります。正解コードの explode(',', $rawInput) の直前に $rawInput = str_replace('、', ',', $rawInput); の1行を追加して、"PHP、初心者, Web開発" でも綺麗に分割できるか試してみましょう!