💡 今日の3行まとめ
  • 文字列の一部を別の文字に置き換えるときは str_replace($検索, $置換, $対象文字列) を使う
  • 第1・第2引数に配列を渡せば、複数の目印をたった1回の呼び出しでまとめて一括置換できる
  • 連想配列で対応表を作り、array_keys() と array_values() で渡すと順番ズレを防げる

1. 今日のお題とゴール

予約完了メッセージのテンプレート文にある3つの目印(プレースホルダー)を、お客様の予約データに置き換えて完成文を出力する処理を作ります。

  • テンプレート "{name}様、{date}の{plan}予約を承りました。" を用意する
  • {name} を 佐藤、{date} を 11月15日、{plan} を ディナーコース に置き換える
  • すべての目印が置き換わった完成メッセージを表示する
// 期待する出力例
佐藤様、11月15日のディナーコース予約を承りました。

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

❌ やりがちなNGコードBefore
<?php
$template = '{name}様、{date}の{plan}予約を承りました。';

// 1項目ずつ順番に上書きしていく
$message = str_replace('{name}', '佐藤', $template);
$message = str_replace('{date}', '11月15日', $message);
$message = str_replace('{plan}', 'ディナーコース', $message);

echo $message . "\n";

項目ごとに str_replace() を繰り返すと、置換箇所が増えるたびに同じような行が縦に伸びてしまいます。1行目だけ $template で2行目以降は $message を渡すため、変数名の書き間違いで前の置換結果が消えるミスも起きがちです。

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

// 1. 目印(プレースホルダー)入りのテンプレート文
$template = '{name}様、{date}の{plan}予約を承りました。';

// 2. 「どの目印を」「何に置き換えるか」を連想配列でまとめる
$replacements = [
    '{name}' => '佐藤',
    '{date}' => '11月15日',
    '{plan}' => 'ディナーコース',
];

// 3. 検索する目印一覧(キー)と、置換後の文字一覧(値)を取り出す
$search  = array_keys($replacements);
$replace = array_values($replacements);

// 4. 配列を渡して1回でまとめて一括置換する
$message = str_replace($search, $replace, $template);

// 5. 完成したメッセージを出力する
echo $message . "\n";

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

1str_replace($検索, $置換, $対象) は配列で一括処理できる

第1引数と第2引数にそれぞれ配列を渡すと、先頭から対応するペアごとにまとめて置換してくれます。同じ関数を何度も呼び出す必要がなくなり、置換処理が1行でスッキリ完結します。

2連想配列と array_keys()・array_values() で順番ズレを防ぐ

検索用の配列と置換用の配列を別々に作ると、要素を追加したときに順番がズレて別の文字に置き換わる事故が起きやすくなります。連想配列で「目印 => 値」をペアで管理してからキーと値に分解すれば、対応関係が絶対にズレません。

3元の文字列は変わらないため、戻り値を変数で受け取る

str_replace() は引数に渡した $template 自体を直接書き換えるのではなく、置換後の新しい文字列を返します。必ず $message = str_replace(...) のように結果を変数へ代入して使いましょう。

4. 1分ミニチャレンジ

🚀 手を動かしてみよう

正解コードの $template 末尾に (人数:{count}名) を足し、$replacements に '{count}' => '4' を1行追加して実行してみましょう。後半の str_replace() を書き換えなくても、自動で置換されることを確認できます。