【PHP入門】foreachループでお知らせ・ニュース一覧を動的に表示する方法
Webサイトでよく見かける「お知らせ」や「ニュース」の一覧。新しい情報が追加されるたびに手作業でHTMLを更新するのは大変ですよね。実は、PHPのforeachループを使えば、そんな手間のかかる作業を自動化し、いつでも最新の情報を表示できる動的なリストを簡単に作成できます。
この記事では、プログラミング初心者の方でもコピペするだけで「動く」を体験できるよう、実用的なお知らせ一覧の表示を例に、PHPの`foreach`ループの使い方を基礎から応用まで分かりやすく解説します。配列に格納したデータを一つずつ取り出して、HTMLのリストとして表示する流れを一緒にマスターしていきましょう!
PHPを動かすための準備(開発環境)まだXAMPP「ザンプ」を構築してない方は、【PHP入門】XAMPPのダウンロードとインストール方法を徹底解説!を参照してください。 インストール後、指定されたフォルダ(`htdocs`など)にPHPファイルを置けば、準備は完了です!
1. 基本のキ!PHPの配列とforeachループ
まずは、`foreach`が何をするものなのかを理解するために、その相棒である「配列」から見ていきましょう。
配列とは、複数の値をまとめて格納できる、箱のようなものです。例えば、お知らせの情報を「日付」と「タイトル」のセットで管理したい場合、以下のように配列を作ることができます。
<?php
// お知らせ情報を格納した配列
$news_items = [
[
"date" => "2025-07-03",
"title" => "夏季休業のお知らせ"
],
[
"date" => "2025-07-01",
"title" => "新サービス「〇〇」を開始しました"
],
[
"date" => "2025-06-20",
"title" => "ウェブサイトをリニューアルしました"
]
];
// 配列の中身を確認(デバッグ用)
print_r($news_items);
?>
この配列という「箱」から、中身を一つずつ取り出して処理するのが`foreach`ループの役目です。構文はとてもシンプルです。
foreach (配列 as 取り出した要素を一時的に入れる変数) { ...処理... }
この構文を使い、先ほどの配列からタイトルだけを順番に取り出して表示させてみましょう。
<?php
$news_items = [
["date" => "2025-07-03", "title" => "夏季休業のお知らせ"],
["date" => "2025-07-01", "title" => "新サービス「〇〇」を開始しました"],
["date" => "2025-06-20", "title" => "ウェブサイトをリニューアルしました"]
];
// 配列から1件ずつお知らせ情報を取り出す
foreach ($news_items as $item) {
// 取り出したお知らせのタイトルを表示する
echo $item['title'] . "\n";
}
?>
このように、`foreach`は配列の中の要素がなくなるまで、自動的に処理を繰り返してくれます。これが動的リスト生成の心臓部となります。
2. 実践!foreachでお知らせ一覧を作成する
それではいよいよ本題です。先ほどの配列と`foreach`ループを使って、Webページに表示できるHTML形式のお知らせ一覧を作成します。以下のコードは、HTMLとPHPを組み合わせた最も基本的な形です。このままファイルにコピペすれば、ブラウザで表示を確認できます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>お知らせ一覧</title>
<style>
body { font-family: sans-serif; line-height: 1.6; padding: 20px; }
.news-list { list-style: none; padding: 0; border-top: 1px solid #ccc; }
.news-list li { padding: 15px 10px; border-bottom: 1px solid #ccc; }
.news-date { font-weight: bold; margin-right: 1em; color: #555; }
</style>
</head>
<body>
<h1>お知らせ</h1>
<?php
// お知らせ情報を配列として用意
$notices = [
[
"date" => "2025-07-03",
"title" => "夏季休業のお知らせ"
],
[
"date" => "2025-07-01",
"title" => "新サービス「〇〇」を開始しました"
],
[
"date" => "2025-06-20",
"title" => "ウェブサイトをリニューアルしました"
]
];
?>
<ul class="news-list">
<?php foreach ($notices as $notice): ?>
<li>
<span class="news-date"><?php echo htmlspecialchars($notice['date']); ?></span>
<span class="news-title"><?php echo htmlspecialchars($notice['title']); ?></span>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
このコードのポイントは、`
- `タグの内側で`foreach`ループを回している点です。配列`$notices`に格納されたデータ1件につき、`
- `タグのセットが1つずつ生成されます。もし配列の要素を4件、5件と増やせば、自動的にリストの項目も増えていきます。これが「動的リスト生成」の仕組みです。
3. 応用例でさらに便利に
基本が分かったところで、より実用的な形に改造していきましょう。
各お知らせにリンクを追加する
お知らせ一覧には、各項目の詳細ページへのリンクが付き物です。配列にURLの情報を追加し、ループの中で`<a>`タグを生成するように変更してみます。
<ul class="news-list"> <?php // URLの情報を追加した配列 $notices_with_links = [ [ "date" => "2025-07-03", "title" => "夏季休業のお知らせ", "url" => "/news/summer-holiday.html" ], [ "date" => "2025-07-01", "title" => "新サービス「〇〇」を開始しました", "url" => "/news/new-service.html" ] ]; foreach ($notices_with_links as $notice): ?> <li> <span class="news-date"><?php echo htmlspecialchars($notice['date']); ?></span> <a href="<?php echo htmlspecialchars($notice['url']); ?>"> <?php echo htmlspecialchars($notice['title']); ?> </a> </li> <?php endforeach; ?> </ul>
タイトル部分を`<a>`タグで囲み、`href`属性に配列から取得したURLを指定するだけで、簡単にリンク付きのリストが完成しました。
日付のフォーマットを変更する
「2025-07-03」のような表記ではなく、「2025年07月03日」のように、より親しみやすい形式で表示したい場合もあるでしょう。PHPの`date()`関数と`strtotime()`関数を組み合わせることで、日付のフォーマットを自由自在に変更できます。
<ul class="news-list"> <?php $notices = [ ["date" => "2025-07-03", "title" => "夏季休業のお知らせ"], ["date" => "2025-07-01", "title" => "新サービス「〇〇」を開始しました"] ]; foreach ($notices as $notice): // 文字列の日付をタイムスタンプに変換 $timestamp = strtotime($notice['date']); // 好きなフォーマットに変換して表示 $formatted_date = date("Y年m月d日", $timestamp); ?> <li> <span class="news-date"><?php echo $formatted_date; ?></span> <span class="news-title"><?php echo htmlspecialchars($notice['title']); ?></span> </li> <?php endforeach; ?> </ul>
`strtotime()`で日付の文字列をPHPが扱える数値(タイムスタンプ)に変換し、`date()`でその数値を指定した書式に変換しています。`"Y年m月d日 (D)"`のようにすれば曜日を追加することも可能です。
4. 気をつけるべき点
`foreach`ループを使う上で、注意しておきたい点がいくつかあります。
配列が空っぽだった場合
まだお知らせが1件も登録されていない場合など、ループ処理の元となる配列が空っぽのケースも考慮しなければなりません。`foreach`は配列が空の場合、何も実行せずにスルーしてくれるのでエラーにはなりませんが、ユーザーには「お知らせがありません」といったメッセージを表示するのが親切です。
PHPの`empty()`関数を使って、配列が空かどうかを事前にチェックします。
<?php // お知らせがまだ1件もない空の配列 $notices = []; ?> <h1>お知らせ</h1> <?php if (empty($notices)): ?> <p>現在、新しいお知らせはありません。</p> <?php else: ?> <ul class="news-list"> <?php foreach ($notices as $notice): ?> <li> <!-- リスト表示処理 --> </li> <?php endforeach; ?> </ul> <?php endif; ?>
`if (empty($notices))`で配列が空の場合の表示を、`else`で配列にデータがある場合のリスト表示処理を、それぞれ記述することで、どんな状況にも対応できる堅牢なコードになります。
HTMLエスケープ処理の重要性
データベースなど、外部から取得したデータをWebページに表示する際には、セキュリティ対策として`htmlspecialchars()`関数を通すことが非常に重要です。これは、悪意のあるJavaScriptコードなどが埋め込まれるクロスサイトスクリプティング(XSS)という攻撃を防ぐためです。
たとえ自分で入力したデータであっても、`echo`で画面に出力する際には必ず`htmlspecialchars()`で囲む癖をつけておくと安全です。
<?php // 悪意のあるデータが混入している例 $notice = [ "title" => "<script>alert('XSS');</script>" ]; ?> <!-- 悪い例:そのまま出力するとスクリプトが実行されてしまう --> <span><?php echo $notice['title']; ?></span> <!-- 良い例:htmlspecialcharsでエスケープ処理を行う --> <span><?php echo htmlspecialchars($notice['title']); ?></span>
良い例の場合、ブラウザ上には「<script>alert('XSS');</script>」という文字列がそのまま表示されるだけで、スクリプトが実行されることはありません。
5. まとめと関連コードの紹介
今回は、PHPの`foreach`ループを使って、配列のデータから動的にお知らせ一覧を生成する方法を解説しました。このパターンは、お知らせ一覧だけでなく、商品リスト、ブログ記事一覧、ギャラリーなど、Webサイトのあらゆる「繰り返し表示」に応用できる非常に強力なテクニックです。
基本の形をマスターしたら、ぜひご自身のサイトで色々なリスト表示に挑戦してみてください。配列のデータをデータベースから取得するように変更すれば、本格的なWebアプリケーションへの第一歩となります。
`foreach`ループと似たような繰り返し処理には、条件が満たされている間だけ処理を続ける`while`ループなどもあります。特定の回数だけ繰り返したい場合は`for`ループが便利です。それぞれの特性を理解し、場面に応じて使い分けることで、プログラミングの幅がさらに広がります。