[PHPのはじめ方] Part7: if/else, switch, while, for, foreach文の使い方

プログラミングをしていると、「もし○○だったら△△する」「□□の間はずっと××する」といった、状況に応じて処理を変えたり、同じ処理を繰り返したりしたい場面がたくさん出てきます。PHPでは、これらの処理を実現するためにいくつかの制御構文が用意されています。このページでは、PHP初学者の皆さんがよく使うことになる基本的な制御構文、if/elseswitchwhileforforeachについて、その使い方を解説していきます!😊

if文は、指定した条件が真 (true) の場合に、特定の処理を実行するための構文です。「もし~ならば…する」という処理を実現します。

さらに、elseを使うと「もし~でなければ…する」、elseifを使うと「そうでなくて、もし~ならば…する」というように、条件に応じて複数の処理を分岐させることができます。

<?php
$score = 85;

if ($score >= 80) {
    echo "素晴らしい!合格です!🎉";
} elseif ($score >= 60) {
    echo "あと少し!もう少し頑張りましょう💪";
} else {
    echo "残念ながら不合格です😢";
}
// 出力: 素晴らしい!合格です!🎉
?>

if文の条件式では、値の比較や論理的な判断を行うために比較演算子論理演算子がよく使われます。

主な比較演算子と論理演算子

演算子 意味
== 等しい $a == $b
=== 等しく、型も同じ $a === $b
!= または <> 等しくない $a != $b
!== 等しくない、または型が違う $a !== $b
< より小さい $a < $b
> より大きい $a > $b
<= 以下 $a <= $b
>= 以上 $a >= $b
&& (and) かつ (両方がtrue) $a > 0 && $b < 10
|| (or) または (どちらか一方がtrue) $a == 1 || $b == 1
! ではない (true/falseを反転) !$is_logged_in

switch文は、ある変数の値が特定の値と一致するかどうかを調べ、一致した場合に特定の処理を実行します。if/elseifをたくさん繋げるよりもコードがすっきりする場合があります。

各条件はcaseで指定し、処理の終わりにはbreak;を記述してswitch文を抜けるのが一般的です。break;を書き忘れると、意図しない処理(次のcaseの処理)まで実行されてしまう(フォールスルー)ので注意が必要です⚠️。どのcaseにも一致しなかった場合の処理はdefaultに記述します。

<?php
$signal = 'red';

switch ($signal) {
    case 'red':
        echo "止まれ!🚦";
        break; // このcaseの処理が終わったらswitch文を抜ける
    case 'yellow':
        echo "注意して進め ⚠️";
        break;
    case 'blue': // PHPでは青信号を 'blue' や 'green' で表現することがあります
    case 'green':
        echo "進め!✅";
        break;
    default:
        echo "信号の色ではありません";
        break;
}
// 出力: 止まれ!🚦
?>

PHP 8.0からは、より厳密な比較を行い、breakが不要で式として値を返すことができるmatch式も導入されました。

while文は、指定した条件式が真 (true) である間、ブロック内の処理を繰り返し実行します。「~の間はずっと…する」という処理に使います。

ループが終了する条件を正しく設定しないと、無限ループに陥ってしまう可能性があるので注意が必要です。

<?php
$count = 0;
while ($count < 3) {
    echo "現在のカウント:" . $count . "<br>";
    $count++; // カウントを1増やす(これが無いと無限ループになる!)
}
/*
出力:
現在のカウント:0
現在のカウント:1
現在のカウント:2
*/ ?>

do-while文

while文と似ていますが、do-while文は条件式の評価をループ処理のに行います。そのため、条件式の結果に関わらず、必ず最低1回はブロック内の処理が実行されます。

<?php
$dice = 0;
do {
    $dice = rand(1, 6); // 1から6のランダムな数を生成
    echo "サイコロの目:" . $dice . "<br>";
} while ($dice != 6); // 6が出るまで繰り返す
echo "6が出ました!🎲";
?>

for文は、主に繰り返す回数があらかじめ決まっている場合に使われます。「~を…回繰り返す」という処理に適しています。

for文は、for (初期化式; 条件式; 変化式) の形式で記述します。

  • 初期化式: ループが始まる前に一度だけ実行されます(例: カウンタ変数の初期化)。
  • 条件式: ループを繰り返すたびに評価され、trueの間ループが続きます。
  • 変化式: ループの各反復の最後に実行されます(例: カウンタ変数の増減)。
<?php
// 1から5までの数字を表示する
for ($i = 1; $i <= 5; $i++) {
    echo "数字:" . $i . "<br>";
}
/*
出力:
数字:1
数字:2
数字:3
数字:4
数字:5
*/ // 九九の表(一部) echo '<table class="table is-bordered">'; for ($i = 1; $i <= 3; $i++) { // 1から3の段 echo "<tr>"; for ($j = 1; $j <= 9; $j++) { // 各段で1から9まで掛ける echo "<td>" . ($i * $j) . "</td>"; } echo "</tr>"; } echo "</table>"; ?>

foreach文は、配列やオブジェクトの各要素に対して繰り返し処理を行うための構文です。配列の要素数だけ自動的にループしてくれるので、配列を扱う際に非常に便利です。

foreachには主に2つの書き方があります。

  1. foreach (配列 as $value): 配列の値を順番に取り出す。
  2. foreach (配列 as $key => $value): 配列のキーと値をセットで順番に取り出す(連想配列などで便利)。
<?php
// 1. 値のみを取り出す例 (数値配列)
$colors = ["red", "green", "blue"];
echo "<ul>";
foreach ($colors as $color) {
    echo "<li>色:" . htmlspecialchars($color, ENT_QUOTES, 'UTF-8') . "</li>";
}
echo "</ul>";
/*
出力:
  • 色:red
  • 色:green
  • 色:blue
*/ // 2. キーと値を取り出す例 (連想配列) $user = [ "name" => "山田太郎", "age" => 30, "city" => "東京" ]; echo "<dl>"; foreach ($user as $key => $value) { echo "<dt>" . htmlspecialchars($key, ENT_QUOTES, 'UTF-8') . "</dt>"; echo "<dd>" . htmlspecialchars($value, ENT_QUOTES, 'UTF-8') . "</dd>"; } echo "</dl>"; /* 出力:
name
山田太郎
age
30
city
東京
*/ ?>

htmlspecialchars関数は、HTMLとして特別な意味を持つ文字(例: <, >, &)をエスケープし、安全にブラウザ表示するために使用しています。

PHPコードの中にHTMLを埋め込む際、if, while, for, foreach, switch文は、波括弧 {} の代わりにコロン :endif;, endwhile;, endfor;, endforeach;, endswitch; を使う代替構文で記述することもできます。これにより、HTMLタグとの組み合わせが視覚的に分かりやすくなることがあります。

<?php $is_logged_in = true; ?>

<?php if ($is_logged_in): ?>
  <p class="has-text-success">ようこそ、ユーザーさん!</p>
<?php else: ?>
  <p class="has-text-danger">ログインしてください。</p>
<?php endif; ?>


<ul>
<?php $items = ['りんご', 'バナナ', 'みかん']; ?>
<?php foreach ($items as $item): ?>
  <li><?= htmlspecialchars($item, ENT_QUOTES, 'UTF-8') ?></li>
<?php endforeach; ?>
</ul>

<?= ... ?><?php echo ... ?> の短縮形です。

今回はPHPの基本的な制御構文であるif/else, switch, while, for, foreachについて学びました。

  • if/else: 条件に応じて処理を分岐させたいとき
  • switch: 一つの変数の値によって多くの分岐があるとき
  • while: 条件が満たされている間、繰り返し処理を行いたいとき
  • for: 繰り返す回数が決まっているとき
  • foreach: 配列やオブジェクトの全要素に対して繰り返し処理を行いたいとき

これらの制御構文を理解し、適切に使い分けることで、より複雑で動的なプログラムを作成できるようになります。それぞれの構文の特徴を掴んで、どんどんコードを書いて練習していきましょう!🚀