MENU

【PHP】if文による条件分岐を解説|Webの基礎

PHPのif文による条件分岐を解説|Webの基礎
目次

はじめに

前回の記事では、計算や比較に使う演算子について解説しました。

今回は、前回学んだ比較演算子や論理演算子を使って、条件によって実行する処理を切り替える「if文」について解説します。「点数によって評価を変える」「ログインしているかどうかで表示を変える」といった処理は、すべてif文で実現します。

条件分岐とは?

これまでの記事のプログラムは、上から順番にすべての行が実行されていました。条件分岐とは、「条件に当てはまる場合だけこの処理を行う」というように、条件によって実行する処理を分けることです。

PHPで条件分岐を書くための代表的な構文がif文です。

VBAのIf 条件 Then 〜 End Ifと同じ役割です。PHPではThenやEnd Ifの代わりに、条件を( )で囲み、処理を{ }で囲んで書きます。

if文の基本

if文は、次の形で書きます。

if (条件) {
    // 条件がtrueのときに実行する処理
}

( )の中の条件がtrueになったときだけ、{ }の中の処理が実行されます。

<?php
    $score = 85;

    if ($score >= 60) {
        echo "合格です";
    }

$scoreは85なので、条件$score >= 60はtrueになり、「合格です」と表示されます。$scoreを45に変えると条件がfalseになり、何も表示されません。

else(条件に当てはまらない場合)

条件に当てはまらなかった場合の処理を書きたいときは、elseを使います。

<?php
    $score = 45;

    if ($score >= 60) {
        echo "合格です";
    } else {
        echo "不合格です";
    }

条件がtrueならif側の処理、falseならelse側の処理が実行されます。どちらか一方だけが必ず実行される、という点がポイントです。

elseif(3つ以上に分ける)

条件を3つ以上に分けたいときは、elseifを使います。次の例は、点数によってA〜Dの評価を表示します。

<?php
    $score = 72;

    if ($score >= 90) {
        echo "A評価";
    } elseif ($score >= 80) {
        echo "B評価";
    } elseif ($score >= 70) {
        echo "C評価";
    } else {
        echo "D評価";
    }

実行すると「C評価」と表示されます。if文は上から順番に条件を判定し、最初にtrueになったブロックだけを実行して終了します。72点は「90以上」「80以上」には当てはまらず、「70以上」で初めてtrueになるため、C評価になります。

点数が90以上ならA、80以上ならB、70以上ならC、それ以外はDと、上から順に判定するif・elseif・elseの流れ図

条件を並べる順番を間違えると、意図しない結果になります。たとえば$score >= 80の判定を$score >= 90より先に書くと、95点でも最初の「80以上」でtrueになり、B評価と表示されてしまいます。範囲で分ける場合は、厳しい条件から順に書きましょう。

PHPではelse if(間にスペースあり)と書いても同じように動きますが、elseifと続けて書くのが一般的です。後述する代替構文ではelseifしか使えないため、elseifで統一しておくのがおすすめです。

条件の書き方

論理演算子で複数の条件を組み合わせる

前回の記事で解説した論理演算子を使うと、複数の条件をまとめて判定できます。

<?php
    $age = 25;
    $isMember = true;

    if ($age >= 20 && $isMember) {
        echo "20歳以上の会員です";
    }

    if (!$isMember) {
        echo "会員登録をお願いします";
    }

$isMemberのように真偽値が入った変数は、$isMember === trueと書かなくても、そのまま条件に書けます。!を付けると「会員ではない場合」という条件になります。

真偽値以外の値を条件にする場合

if文の条件に真偽値以外の値を書くと、その値は真偽値に変換されてから判定されます。データ型の記事で紹介した「falseとみなされる値」を覚えておきましょう。

falseとみなされる値例
falsefalse
0・0.00、0.0
空の文字列・”0″""、"0"
NULLnull
空の配列[]
<?php
    $name = "0";

    if ($name) {
        echo "入力あり";
    } else {
        echo "入力なし"; // "0"はfalseとみなされるため、こちらが表示される
    }

「何か入力されているか」を判定したい場合、if ($name)と書くと、"0"という入力まで「入力なし」と判定されてしまいます。空文字かどうかを判定したいときは、if ($name !== "")のように比較演算子で明確に書くと安全です。

if文の入れ子(ネスト)

if文の中に、さらにif文を書くこともできます。これを入れ子(ネスト)と呼びます。

<?php
    $age = 25;
    $hasTicket = true;

    if ($age >= 18) {
        if ($hasTicket) {
            echo "入場できます";
        } else {
            echo "チケットを購入してください";
        }
    } else {
        echo "18歳未満は入場できません";
    }

入れ子が深くなるとコードが読みにくくなります。「両方の条件を満たすときだけ処理する」という場合は、&&で1つの条件にまとめると見通しがよくなります。

<?php
    if ($age >= 18 && $hasTicket) {
        echo "入場できます";
    }

HTMLと組み合わせる書き方(代替構文)

PHPはHTMLの中に埋め込んで使うことが多い言語です。HTMLの表示をif文で切り替えたいときは、{ }の代わりに:とendif;を使う代替構文を使うと、HTMLとPHPの区切りが分かりやすくなります。

<?php
    $isLoggedIn = true;
    $userName = "田中";
?>

<?php if ($isLoggedIn): ?>
    <p>ようこそ、<?php echo $userName; ?>さん</p>
<?php else: ?>
    <p>ログインしてください</p>
<?php endif; ?>

$isLoggedInがtrueなら「ようこそ、田中さん」、falseなら「ログインしてください」の段落が表示されます。

通常の波括弧を使ったif文と、コロンとendifを使った代替構文を左右に並べ、対応する部分を示した図

if (条件):のように条件の後ろに:を付け、else:・elseif (条件):で分岐し、最後をendif;で閉じます。{ }で書くと閉じ括弧}がどのif文に対応するのか分かりにくくなりますが、代替構文ならendif;で終わりがはっきりします。WordPressのテーマファイルでもよく使われている書き方です。

実務サンプル(フォームの入力値をチェックする)

Webフォームで入力された年齢をチェックし、問題があればエラーメッセージを表示するサンプルです。「空欄ではないか」「数字か」「範囲内か」を順番に判定します(フォームから値を受け取る方法は、第2弾の「Webフォーム処理」で解説予定です。ここでは入力値を変数で代用しています)。

年齢の入力値を、空欄か、数字か、0〜120の範囲内かの順にチェックし、当てはまった段階でエラーメッセージを表示する流れ図
<?php
    // フォームから届いた年齢(文字列)を想定
    $inputAge = "150";

    if ($inputAge === "") {
        $message = "年齢を入力してください";
    } elseif (!is_numeric($inputAge)) {
        $message = "年齢は半角数字で入力してください";
    } elseif ((int)$inputAge < 0 || (int)$inputAge > 120) {
        $message = "年齢は0〜120の範囲で入力してください";
    } else {
        $message = "入力を受け付けました({$inputAge}歳)";
    }

    echo $message;

is_numeric()は、値が数値として解釈できるかどうかをtrue/falseで返す関数です。$inputAgeの値を変えて実行すると、次のように結果が変わります。

$inputAgeの値表示されるメッセージ
""(空欄)年齢を入力してください
"abc"年齢は半角数字で入力してください
"25"(全角)年齢は半角数字で入力してください
"150"年齢は0〜120の範囲で入力してください
"25"入力を受け付けました(25歳)

elseifで上から順番にチェックしているため、最初に見つかった問題のメッセージだけが表示されます。「空欄のときに『数字で入力してください』と表示される」といった的外れなメッセージを防げるのが、この書き方のポイントです。

よくある質問・エラー対処

Q. 条件に関係なく、if文の中の処理が必ず実行されてしまいます

→ 次の2つの書き間違いがないか確認してください。

  • if ($x = 5)のように、比較の==(または===)ではなく代入の=を書いている。代入した値(5)がそのまま条件になるため、常にtrueになります
  • if ($x == 5);のように、条件の)の直後にセミコロンを付けている。if文がそこで終わってしまい、後ろの{ }はif文と関係なく必ず実行されます

Q. { }を省略して書いてもいいですか?

→ 処理が1行だけなら省略しても動きますが、後から2行目を追加したときに、2行目がif文の外側になってしまうミスが起こりやすくなります。1行だけの場合も{ }を付けておくのがおすすめです。


Q. Unclosed '{'やunexpected end of fileというエラーが出ます

→ どちらも、ブロックの終わりが見つからないときに表示されるエラーです。

  • Unclosed '{' on line 3:3行目の{に対応する}が足りません
  • syntax error, unexpected end of file, expecting "elseif" or "else" or "endif":代替構文でendif;を書き忘れています

ブロックの開始と終了が正しく対応しているか確認してください。

おわりに(まとめ)

まとめ

if文を使うと、条件によって実行する処理を切り替えられます。

  • ✅ if (条件) { 処理 } で、条件がtrueのときだけ処理を実行する
  • ✅ elseで条件に当てはまらない場合、elseifで3つ以上の分岐を書ける
  • ✅ if文は上から順に判定し、最初にtrueになったブロックだけを実行する
  • ✅ 論理演算子で複数の条件をまとめると、入れ子を減らせる
  • ✅ HTMLと組み合わせるときは、if: 〜 endif; の代替構文が便利
  • ✅ =と==の書き間違い、条件直後のセミコロンに注意する

次回は、条件分岐のもう1つの書き方「switch文」について解説します。

次回は、1つの値に応じて処理を分けるときに便利なswitch文と、PHP 8から使えるmatch式について解説予定です。

この記事が、少しでも誰かのお役に立てれば幸いです。

関連記事

当サイトの記事で使用したVBAなどのサンプルをDLできます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


【CSS】テキスト関連プロパティについて基本解説|Webの基礎


よかったらシェアしてね!
  • URLをコピーしました!
目次