PHPのif文を入れ子(ネスト)にする方法【複雑な条件分岐を解説】

if文の基本的な使い方をマスターすると、「もしAだったら、さらにその中でBだったら…」という、より細かな条件で処理を分けたい場面が出てきます。例えば、「会員ユーザーで、なおかつ購入金額が5,000円以上の場合に割引を適用する」といったケースです。

このような、条件分岐の中にさらに条件分岐を記述する構造を「入れ子(ネスト)構造」と呼びます。

今回は、if文の入れ子(ネスト)を使って、より複雑な条件分岐を組み立てる方法を初心者向けに分かりやすく解説します。


目次

if文の入れ子(ネスト)とは?

入れ子(ネスト)構造とは、if文の { } のブロックの中に、もう一つ別のif文を記述することです。これにより、最初の条件をクリアした場合にのみ、次の条件分岐に進むという処理の流れを作ることができます。

言葉で聞くと難しそうですが、構造は非常にシンプルです。

<?php
if (外側の条件) {
    // 外側の条件がtrueの場合に実行される処理
    
    if (内側の条件) {
        // 内側の条件もtrueの場合に実行される処理
    } else {
        // 内側の条件がfalseの場合に実行される処理
    }
    
} else {
    // 外側の条件がfalseの場合に実行される処理
}

**インデント(字下げ)**を正しく行うことで、どこからどこまでがどのif文のブロックなのかが視覚的に分かりやすくなります。コードの可読性を保つために、インデントは必ず揃えるようにしましょう。


サンプルコードで学ぶ入れ子(ネスト)構造

ECサイトの割引キャンペーンを例に、入れ子構造の使い方を見ていきましょう。 キャンペーンのルールは以下の通りです。

  1. まず、会員であるかどうかをチェックする。
  2. 会員だった場合、購入金額が5,000円以上かどうかをチェックし、割引を適用する。

この2段階の条件分岐を、if文の入れ子を使って実装してみます。

<?php
// ユーザー情報とカート情報
$is_member = true;     // 会員かどうか (true: 会員, false: 非会員)
$cart_total = 6000;    // カートの合計金額

echo "<h2>お会計</h2>";

// === まず、会員かどうかで分岐(外側のif)===
if ($is_member === true) {
    echo "<p>会員様、いつもご利用ありがとうございます。</p>";

    // === 次に、会員の中から購入金額で分岐(内側のif)===
    if ($cart_total >= 5000) {
        echo "<p>会員様限定!5,000円以上のお買い上げで500円割引クーポンを適用しました!</p>";
        $final_price = $cart_total - 500;
    } else {
        $needed = 5000 - $cart_total;
        echo "<p>あと{$needed}円で割引クーポンが適用されます。</p>";
        $final_price = $cart_total;
    }

} else {
    echo "<p>ゲスト様、こんにちは。</p>";
    echo "<p>会員登録いただくと、お得な割引をご利用いただけます。</p>";
    $final_price = $cart_total;
}

echo "<hr>";
echo "<p><strong>お支払い金額は " . number_format($final_price) . "円です。</strong></p>";
?>

このコードでは、まず外側のif文で $is_membertrue かどうかを判定しています。true だった場合にのみ、内側のif文($cart_total の判定)が実行される仕組みです。


論理演算子(&&)との使い分け

「あれ?これって論理演算子の&& (AND)でも書けるのでは?」と気づいた方もいるかもしれません。その通りです。先ほどの「会員」かつ「5,000円以上」という条件は、&&を使っても表現できます。

<?php
$is_member = true;
$cart_total = 6000;

if ($is_member === true && $cart_total >= 5000) {
    // 会員で、かつ5,000円以上の場合の処理
    echo "会員様限定クーポンを適用しました!";
    $final_price = $cart_total - 500;
} else {
    // それ以外の全てのケース
    // ...
}

では、どちらを使えば良いのでしょうか?

  • 論理演算子 (&&) を使う場合:
    • 複数の条件をすべて満たしたときだけ特定の処理を行いたい場合。
    • コードがシンプルで一行にまとまる。
  • 入れ子(ネスト)構造を使う場合:
    • 条件の途中段階でも、異なるメッセージを表示したり、別の処理を行ったりしたい場合。
    • (例:会員だけど5,000円未満の場合に「あと〇〇円で割引です」と表示する)
    • 処理の流れや条件の段階が、より明確になる。

どちらが良いかは状況によりますが、「それぞれの条件分岐で個別に行いたい処理があるか?」を基準に考えると良いでしょう。

⚠️注意:ネストのしすぎに注意!

入れ子構造は便利ですが、3重、4重と深くしすぎると、コードがどこで何をしているのか非常に分かりにくくなります。これは「ネストが深い」と呼ばれ、バグの原因になりやすいコードの代表例です。もしネストが深くなりそうな場合は、処理を関数に分けるなど、コードをシンプルに保つ工夫を考えましょう。


まとめ

今回は、if文の入れ子(ネスト)構造について学びました。

【ポイントの振り返り】

  • **入れ子(ネスト)**とは、if文の中にさらにif文を記述する構造のこと。
  • 段階的な条件分岐を作ることで、より現実に即した複雑な処理が可能になる。
  • インデントを正しく使い、コードの可読性を保つことが重要。
  • 論理演算子(&&)と使い分けることで、より意図が明確なコードを書ける。

if文の入れ子をマスターすれば、表現できるプログラムの幅が大きく広がります。まずは2段階のネストから試してみて、その処理の流れをしっかりと掴みましょう。

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

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次