10日で覚えるPHPのキソ 第 5 回 条件分岐

No Photo

第5回は条件分岐についてお話します。
第1回で、プログラムは上から下に流れる、とお話しました。
でも場合によっては、「同じ処理を繰り返したい」、「結果によって処理を変えたい」事もあるでしょう。
そんな時に活躍するのが、制御文(今回お話する条件分岐、次回に予定している繰り返し)です。

ではまず、条件分岐のif文からご説明します。

if文

英語のifの意味の通り、「もし○○だったら、△△する」というような、条件によって処理を分けたい時に使います。
プログラムの流れは、条件が成り立った場合と成り立たなかった場合の2つに分かれます。
(if文を複数使用する事によって2つ以上の流れを作る事もできます。)
条件には、前回に出てきた比較演算子や論理演算子を使った条件式を指定します。
if文には以下の3つの種類があります。

  • ifのみ
  • if~else文
  • if~elseif~else文

    それでは順番に説明します。

  • ifのみ
    ifの後の「()」の中に条件を書きます。
    条件が成り立った場合の処理を「{}」(ブレス)の中に書きます。( ブレスで囲まれた処理のかたまりをブロックと言います。)
    条件が成り立たない場合には、処理1が実行されません。

080421_ichikawa_php05_01.gif

図の矢印は、プログラムの流れを表しています。
条件が成り立つ時を真(TRUE)といいます。
反対に、条件が成り立たない時を偽(FALSE)といいます。

では実際にプログラムを書いてみましょう。

<?php

    $a = 10;

    // 「$aが10だったら」という条件
    if ($a === 10) {

        // 条件にあった場合処理をする。
        print '$aの値は10です。';

    }

?>

プログラムの流れが、if文の始まりで2つに分かれます。
条件がTRUEの場合(条件に合った場合)には図の赤の矢印の流れです。
if文のブロック({ }の中)の処理1を実行します。
一方、条件がFALSEの場合(条件に合わなかった場合)は青の矢印流れです。
if文のブロックの処理1を飛ばして(処理せず)、プログラムは下へと流れます。

ブラウザの表示は…

$aの値は10です。
  • if~else文
    else以下には、条件が成り立たない場合の処理を書きます。

080421_ichikawa_php05_02.gif

実際にプログラムを書いてみましょう。

<?php

    // $aに値を代入
    $a = 10;

    // 「$aが5だったら」という条件
    if ($a === 5) {

        // 条件に合った場合の処理。
        print '$aの値は5です。';

    } else {

        // 条件に合わなかった場合の処理。
        print '$aの値は5以外です。';

    }

?>

if文の条件がTRUEの場合には、if文のブロックに入り、処理1を実行します。
(elseのブロックの中の処理2は実行しません。)
if文の条件がFALSEの場合には、if文のブロックに入らず、elseの中の処理2を実行します。
実行する処理はどちらか1つです。どちらかの処理が行われた後に、if文を抜けます。

ブラウザの表示は…

$aの値は5以外です。
  • if~elseif~else文
    複数の条件のどれにあてはまるかによってそれぞれ違う処理を行いたい時は、elseifを使います。
    (elseifは条件の数だけ複数書くことが出来ます。)

080421_ichikawa_php05_04.gif

実際にプログラムを書いてみましょう。

<?php

    $a = 10;

    // 「$aが5だったら」という条件
    if ($a === 1) {

        // 「$a === 1」の条件に合った場合の処理。
        print '$aの値は1です。';

    } elseif ($a === 5) {

        // 上記の条件に合わず、条件「$a === 5」にあった場合の処理。
        print '$aの値は5です。';

    } elseif ($a === 10) {

        // 上記の2つの条件に合わず、条件「$a === 10」にあった場合の処理。
        print '$aの値は10です。';

    } else {

        // どの条件にも合わなかった場合の処理。
        print '$aの値は5と10以外です。';

    }

?>

条件1がTRUEの時は、処理1を実行します。
条件1がFALSEで、条件2がTRUEの時は、処理2を実行します。
条件1と2がFALSEで、条件3がTRUEの時は、処理3を実行します。
すべての条件に一致しない時は、else以下の処理を実行します。
実行する処理はどれか1つです。どれか1つの処理が行われた後にif文を抜けます。

ブラウザの表示は…

$aの値は10です。

if文のルール

  • if文は必ず、「if(条件)」から始める
  • elseif、elseは省略可能
  • elseifは複数記述可能
  • 条件1がFALSEの場合は条件2、条件2がFALSEの場合は条件3、どの式も当てはまらない(FALSE)場合はelseの処理が行われる。
  • ifブロック内でどれかの処理が行われた場合、処理後にifブロックを抜ける
  • elseを記述しないと、どの処理も実行されない場合がある。

入れ子になったif文

if文をはじめとする制御文では、処理の中にさらに制御文を含める事ができます。

080421_ichikawa_php05_03.gif

<?php
    // $aに値を代入
    $a = 10;

    // $aが5より大きいという条件
    if ($a > 5) {

        // $aが8という条件
        if ($a === 8) {

            // 上記2つの条件に合った場合の処理
            print '$aの値は8です。';

        } else {

            // 「$aが5より大きい」という条件に合ったが、「$a === 8」という条件に合わなかったときの処理
            print '$aの値は5より大きく、8以外です。';
        }
    } else {

        // 「$aが5より大きい」という条件に合わなかったときの処理
        print '$aの値は5より小さい。';

    }
?>

ブラウザの表示は…

$aの値は5より大きく、8以外です。

三項演算子

三項演算子は、if文と似たような使い方ができる条件演算子です。
「?」「:」を組み合わせて使います。

080421_ichikawa_php05_06.gif

Xが15より小さかった場合(条件)には$aは10、大きかった場合には$aは20となります。

実際にプログラムを書いてみましょう。

<?php
    // $aに値を代入
    $a = 1000;
    // $aは500以上なので、$bには「TRUEの時の値」が代入されます。
    $b = ($a > 500) ? "TRUEの時の値" : "FALSEの時の値";
    // $bをブラウザに出力してみます。
    echo $b;
?>

ブラウザで表示すると…

TRUEの時の値

上記のプログラムを、if文で書くとどうなるでしょうか?

<?php
    // $aに値を代入
    $a = 1000;

    if ($a > 500) {
        $b = "TRUEの時の値";
    } else {
        $b = "FALSEの時の値";
    }
    // $bをブラウザに出力してみます。
    echo $b;
?>

三項演算子を用いた方が、よりすっきりと書くことができます。

次に、もうひとつの条件分岐switchについてお話します。

switch文

if文は、条件式がTRUE(合っている)かFALSE(合っていない)かによる判定でしたが、switchは式の値を条件とし、またそれを複数指定することができます。
ちょうど、if文を並べたような形式です。

080421_ichikawa_php05_05.gif

switch文のルール

  • switch文はcase句と一緒に使用する。
  • 式の値が判定され、caseの値に適合した処理が実行される。
  • break句に到達すると、switchブロックを抜ける
  • break句がない場合は、次のcase句やdefault句の処理へ突入する。
  • switchの式がどれにも当てはまらない場合は、default句に遷移する。
  • default句は省略可能。

実際にプログラムを書いてみましょう。

<?php
    // $aに値を代入
    $a = 1000;
    // $aの値によって分岐します。
    switch ($a) {
        // $aが1000の時
        case 1000:
            print '$aの値は1000です。';
            break;
        // $aが2000の時
        case 2000:
            print '$aの値は2000です。';
            break;
        // $aが3000の時
        case 3000:
            print '$aの値は3000です。';
            break;
        // 上記のどの条件にも当てはまらない時
        default:
            print '$aの値は1000・2000・3000以外です。';
            break;
    }
?>

ブラウザで表示すると…

$aの値は1000です。

条件分岐の使い分け

同じ条件文に対して、if文・switch文両方で書くことができます。
どちらを使うかは、プログラムの読みやすさ(可読性の高さ)事を優先するとよいでしょう。

例えば、$aの値に応じて表示が変わるプログラムを作ります。
$aが0~4の場合には、「$aの値は0~4の間の値です。」という表示をだします。
$aが5~9の場合には、「$aの値は5~9の間の値です。」という表示をだします。
$aが上記以外の場合には、「$aの値は0~9以外の値です。」という表示をだします。

まずはif文で書いてみます。

<?php
    // $aに値を代入
    $a = 10;
    // $aが0,1,2,3,4のいずれかの場合
    if ( $a == 0 || $a == 1 || $a == 2 || $a == 3 || $a == 4) {
        print '$aの値は0~4の間の値です。';
    } elseif( $a == 5 || $a == 6 || $a == 7 || $a == 8 || $a == 9) {
        print '$aの値は5~9の間の値です。';
    } else {
        print '$aの値は0~9以外の値です。';
    }
?>

間違ってはいませんが、一般的にプログラムは横に長くなりすぎるのは良くないとされています。
では次にswitch文で書いてみましょう。

<?php
    // $aに値を代入
    $a = 10;
    // $aの値によって分岐します。
    switch ($a) {
        // $aが0~4の時
        case 0:
            print '$aの値は0~4の間の値です。';
            break;
        case 1:
            print '$aの値は0~4の間の値です。';
            break;
        case 2:
            print '$aの値は0~4の間の値です。';
            break;
        case 3:
            print '$aの値は0~4の間の値です。';
            break;
        case 4:
            print '$aの値は0~4の間の値です。';
            break;
        // $aが5~9の時
        case 5:
            print '$aの値は5~9の間の値です。';
            break;
        case 6:
            print '$aの値は5~9の間の値です。';
            break;
        case 7:
            print '$aの値は5~9の間の値です。';
            break;
        case 8:
            print '$aの値は5~9の間の値です。';
            break;
        case 9:
            print '$aの値は5~9の間の値です。';
            break;
        // 上記のどの条件にも当てはまらない時
        default:
            print '$aの値は0~9以外の値です。';
            break;
    }
?>

こちらも間違ってはいませんが、同じ処理となるcase句はまとめることができます。
異なる条件式の値でも、同じ処理を行う場合にはbreak句を省いて記述した方が分かりやすくなります。
同じ処理となるcase句をまとめたswitch文で書いてみましょう。

<?php
    // $aに値を代入
    $a = 10;
    // $aの値によって分岐します。
    switch ($a) {
        // $aが0~4の時
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
            print '$aの値は0~4の間の値です。';
            break;
        // $aが5~9の時
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
            print '$aの値は5~9の間の値です。';
            break;
        // 上記のどの条件にも当てはまらない時
        default:
            print '$aの値は0~9以外の値です。';
            break;
    }
?>

ブラウザで表示すると…

$aの値は0~9以外の値です。

以上のようになります。
場合に応じて使い分けられるようになりましょう。

次回は制御文の繰り返しについてお話します。

■ 用語集

■ 参考サイト・文献

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ