PHPでデータベースからfetchAll()
を使ってデータを取得すると、結果は複数のレコード(行)が格納された「配列」の形で手に入ります。この配列のデータをWebページに一覧表示させるには、配列の中の要素を一つずつ順番に取り出して処理する必要があります。
この「順番に処理する」という操作を実現するのが、**「繰り返し処理(ループ)」**です。
この記事では、PHPで配列を扱う際に最もよく使われるforeach
ループの基本的な使い方と、それを使ってデータベースの検索結果をHTMLのテーブルとして表示する実践的な方法を解説します。
1. 繰り返し処理の基本「foreach」構文
**foreach
**ループは、配列に含まれる要素の数だけ、指定した処理を自動的に繰り返してくれる構文です。配列の最初の要素から最後の要素まで、順番に一つずつ取り出して処理を行ってくれます。
これを、たくさんのカードが入った箱(配列)から、カードを一枚ずつ取り出して(変数)、書かれている内容を確認する作業に例えると分かりやすいでしょう。
基本構文:
foreach (配列の変数 as 取り出した1要素を格納する変数) {
// 配列の要素1つひとつに対する処理をここに書く
}
簡単な例:
<?php
$fruits = ['りんご', 'みかん', 'ぶどう'];
// $fruits配列から要素を一つずつ取り出し、$fruitという変数に入れる
foreach ($fruits as $fruit) {
echo $fruit . "<br>";
}
/*
出力結果:
りんご
みかん
ぶどう
*/
?>
このように、配列の要素数に関わらず、全ての要素に対して同じ処理を簡潔に記述できます。
2. foreach
でデータベースの検索結果を表示する
このforeach
ループは、$stmt->fetchAll(PDO::FETCH_ASSOC)
で取得したデータベースの検索結果(多次元配列)を処理するのに最適です。
fetchAll()
が返す配列の各要素は、一行分のレコードデータ(カラム名をキーとする連想配列)です。foreach
を使うことで、このレコードを一行ずつ取り出し、HTMLの<tr>
(テーブルの行)として出力していくことができます。
3. 完成版コード:ループ処理で動的なテーブルを作成する
それでは、データベースから取得したレビュー情報(配列$reviews
)を、foreach
ループを使ってHTMLのテーブルとして表示する、完全なサンプルコードを見てみましょう。
PHPのコードをHTMLに埋め込む際は、echo
でHTMLタグを大量に出力するよりも、HTML構造の中にPHPのロジックを埋め込む方が、はるかに見やすく、メンテナンスしやすくなります。
list.php
の<tbody>
部分のサンプルコード:
<table>
<thead>
<tr>
<th>書籍名</th>
<th>評価</th>
<th>感想</th>
</tr>
</thead>
<tbody>
<?php foreach ($reviews as $review): ?>
<tr>
<td><?php echo htmlspecialchars($review['book_title'], ENT_QUOTES, 'UTF-8'); ?></td>
<td><?php echo htmlspecialchars($review['rating'], ENT_QUOTES, 'UTF-8'); ?></td>
<td><?php echo nl2br(htmlspecialchars($review['review_text'], ENT_QUOTES, 'UTF-8')); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
コードの解説:
- HTMLの基本構造:
<table>
や<thead>
(見出し部分)は、ループの外側に静的なHTMLとして記述します。 foreach
ループ: データを表示する<tbody>
の中で、PHPのforeach
ループを開始します。<?php foreach ($reviews as $review): ?>
という書き方は、HTML内に埋め込む際に見やすい代替構文です。- 動的な行の生成: ループの中で、一行分のデータを表す
<tr>
タグを生成します。$reviews
配列の要素数だけ、この<tr>...</tr>
のブロックが繰り返されます。 - データの出力: 各
<td>
(セル)の中で、$review
変数からカラム名をキーとして値を取り出し(例:$review['book_title']
)、echo
で出力します。このとき、htmlspecialchars()
によるエスケープ処理を忘れないようにしましょう。 - ループの終了:
<?php endforeach; ?>
でループを閉じます。
まとめ
- 配列の各要素に対して順番に処理を行うには、
foreach
ループが非常に便利。 - データベースから
fetchAll()
で取得した配列をforeach
で処理し、ループ内で<tr>
や<td>
タグを生成することで、動的な一覧表を作成できる。 echo
でHTMLタグを大量に出力するより、HTMLの構造にPHPのロジ-ックを埋め込む方が、コードがクリーンで管理しやすくなる。
この「データベースから取得 → foreach
でループ → HTMLとして出力」という一連の流れは、PHPでWebアプリケーションを開発する上での最も基本的なパターンの一つです。ブログの記事一覧、商品リスト、検索結果など、あらゆる「一覧表示」機能でこの技術が応用されています。