条件分岐とループ

条件を調べて処理をする- (1)

1行だけのコードを実行するif文

条件式が成立する時に、1行のみ出力される単純なif文です。

単純なif文

    <?php
        $name = "単純 太郎";
        if( $name == "単純 太郎" )

        echo "私の名前は単純 太郎です";

    ?>
    

上記のスクリプトでは、$nameの変数が「単純 太郎」である場合、ifの条件式を満たし、echoで「私の名前は単純 太郎です」が出力されます。

実行結果

私の名前は単純 太郎です

複数行のコードを実行するif文

if文の条件を満たすときに、複数の結果を得るときには、実行される範囲を「{}(中かっこ)」で括ります。

{}(中かっこ)で複数の結果を得る

    <?php
        $grape = "ぶどう";
        if( $grape == "ぶどう" ) {

            echo "ぶどうはおいしいのでしょうか?<br />¥n";
            echo "ぶどうはおいしいです";
        }
    ?>
    

上記のスクリプトでは、ifの条件式の$grapeが「ぶどう」であった場合、「{}(中かっこ)」で括られた範囲が実行されます。ここでは、「ぶどうはおいしいのでしょうか?ぶどうはおいしいです」が出力されます。

実行結果

ぶどうはおいしいのでしょうか?
ぶどうはおいしいです

複雑な条件を指定する

if文は条件式を組み合わせることによって、より多くの条件を設定することができます。

and論理演算子により両方の条件を満たす時に出力がされる

    <?php
        $grape = "ぶどう";
        $apple = "りんご";

        if( $grape == "ぶどう" and $apple == "りんご")

        echo "ぶどうとりんごはおいしいです";
    ?>
    

上記のスクリプトでは、andの論理演算子により$grapeがぶどう、$appleがりんご、というように二つの条件を満たした時に、「ぶどうとりんごはおいしいです」が出力されます。

実行結果

ぶどうとりんごはおいしいです

or論理演算子によりどちらか一行の条件を満たすときに出力がされる

    <?php
        $grape = "ぶどう";
        $apple = "りんご";

        if( $grape == "ぶどう" or $apple == "みかん")

        echo "果物は体に良い";
    ?>
    

上記のスクリプトでは、$apple = "りんご"が$apple == "みかん"になっていますが、$grape = "ぶどう";を満たしているので(or論理演算子によりどちらか一方の条件を満たせば良いので)「果物は体に良い」が出力がされています。

実行結果

果物は体に良い

条件を調べて処理をする- (2)

if~else文

if~else文を使用すると、条件を満たす場合、満たさなかった場合の分岐の処理をさせることができます。

条件を満たす場合

    <?php
        $grape = "ぶどう";

        if( $grape == "ぶどう" ) {

            echo "これはぶどうです";

        } else {

            echo "これはぶどうではありません";
        }
    ?>
    

上記のスクリプトでは、if内の条件を満たしているので、「これはぶどうです」が出力されます。

実行結果

これはぶどうです

条件を満たしていない場合

    <?php
        $grape = "りんご";

        if( $grape == "ぶどう" ) {

            echo "これはぶどうです";

        } else {

            echo "これはぶどうではありません";
        }
    ?>
    

上記のスクリプトでは、if内の条件を満たしていないので、「これはぶどうではありません」が出力されます。

実行結果

これはぶどうではありません

if~elseif文

if~elseif文を使用することによって、条件を満たさない場合に、さらに条件を設定することができます。

elseifはいくつ使用しても大丈夫です。また、条件の最後にelseを使用することによって、どの条件にも当てはまらない場合の条件も設定できます。

if~elseif文を使用することにより複数の条件を設定

    <?php

        $fruit = "ぶどう";

        if( $fruit == "ぶどう" ) {

           echo "これはぶどうです";

        } elseif ( $fruit == "りんご" ) {

           echo "これはりんごです";

        } elseif ( $fruit == "なし" ) {

           echo "これはなしです";

        } elseif ( $fruit == "みかん" ) {

           echo "これはみかんです";

        } else {

           echo "これはなんでしょうか?";

        }
    ?>
    

上記のスクリプトでは、$fruit = "ぶどう"により最初のif内の条件を満たしているので、「これはぶどうです」が出力されます。もし、$fruit = "ぶどう"が$fruit = "りんご"であれば「これはりんごです」が出力されます。

そして、どの条件にも当てはまらない場合(ぶどうでも、りんごでも、なしでも、みかんでもない場合)、は「これはなんでしょうか?」が出力されます。

実行結果

これはぶどうです

条件を調べて処理をする- (3)

htmlページでの埋め込みに便利な(if:~endif文)

if:~endif文は役割としては他のif文と同じではありますが、記述の仕方に違いがあります。「(中かっこ)」で処理範囲を指定するのではなく、「:(コロンを)」を使用します。ここでは「<?php if ( $fruit == "りんご" ): ?>」で使用しています。

htmlに埋めこんで使用したif:~endif文

    <?php
        $fruit = "りんご";
    ?>

    <html>
    <head>
    <meta http-equiv="Content-Languagee" content="ja" />
    <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
    <title>果物</title>
    </head>
    <body>

    <?php if ( $fruit == "りんご" ): ?>

    <table width="535" border="1">
        <tr>
            <th bordercolor="#CCCCCC" width="135">
              果物
            </th>
            <th bordercolor="#CCCCCC" width="135">
              内容
            </th>
        </tr>
        <tr>
            <td width="135" align="center">
                りんご
            </td>
            <td width="400">
                表面に付着する農薬等の問題や、食べやすさの点から、皮をむいて食べられることが多い。
            </td>
        </tr>
    </table>

    <?php endif; ?>

    </body>
    </html>
    

実行結果

if:~endif文によって生成されたテーブル

上記スクリプトの<? php$fruit = "りんご";?> と <?php if ( $fruit == "りんご" ): ?> と <?php endif; ?> が phpのスクリプト部分となります。

「<? php$fruit = "りんご";?>」の$fruit = "りんご";は変数$fruitにりんごを代入しています。「<?php if ( $fruit == "りんご" ): ?>」の「if ( $fruit == "りんご" )」はif文で<?php endif; ?>までの間のhtmlを変数$fruitがりんごであった場合に生成しています。ここでもし、「$fruit == "りんご"」にりんご以外の文字を代入するとテーブルで装飾されたりんごの内容文は表示されません。

条件を調べて処理をする- (4)

if文を効率的に記述する(switch文)

switch文を使うと、同じ変数の繰り返し評価する条件式を効率的に記述することができます。

if-elseif-elseでは、複数の条件を上から順番にチェックして、最初に条件が成立したブロックの処理をさせる(条件が成立しなかった場合はelseブロック)構造ですが、switch文では、switch文の「( )括弧」内に、条件判定させる変数や式を記述し、case式で判定する値を記述していきます。

    switch( 式 ) {

        case 値①:

            // 式の値が値①の場合、処理されます。
            break;

        case 値②:

            // 式の値が値②の場合、処理されます。
            break;

        default:
            // 式の値が上記のどれにも該当しない場合、処理されます。
    }
    

実際に、switch文を使用して条件式を記述してみます。

switch文で記述した条件式

    <?php

        $fruit = "みかん";

        switch( $fruit ) {

            case "ぶどう":

                echo "これはぶどうです";
                break;

            case "りんご":

                echo "これはりんごです";
                break;

            case "なし":

                echo "これはなしです";
                break;

            case "みかん":

                echo "これはみかんです";
                break;

            default:

                echo "これはなんでしょうか?";
        }
    ?>
    

上記のスクリプトでは、case式を使用して、switch文の「( )括弧」内に記述されている「$fruit」の値に一致するものを判定しています。

そして、「$fruit」の値に一致した場合、※breakで処理を終了します。

switch文で記述できることはif文で記述できますが、多くの値と一致するかどうかを比較する場合には、if-elseif-elseで何度も同じ変数を判定するよりは、switch文を使った方が分かりやすく記述できます。


各case式の最後に「break」が記述されていない場合、該当したcaseの処理よりうしろに記述されている全てのcaseの処理が実行されてしまいます。必ずcase毎に「break」を記述し、処理を終了させるようにしなければなりません。

実行結果

これはみかんです

繰り返す-(1)

条件式を先に評価する(while文)

while文は前の項で紹介したif文と似ています。「{}(中かっこ)」によって実際に処理が走る範囲を囲います。

条件を満たしている場合は、かっこで囲った処理を繰り返し実行します。

whileの特性は、条件式を見てから処理を実行します。最初にwhlieの処理が走る場合に条件を満たさない場合は、かっこの中のコードは一度も実行はされません。

1~5まで繰り返し実行する

    <?php
        $i = 1;
        while( $i < 6 ) {

            echo "$i 回目のループです。<br />¥n";

            $i++;
        }
    ?>
    

実行結果

1 回目のループです。
2 回目のループです。
3 回目のループです。
4 回目のループです。
5 回目のループです。

$i++;は変数$iの値をループされるたびに1増やします。while( $i < 6 )の条件から変数$iの値が6以上になると処理が止まりますので、上記のスクリプトでは5回目のループまでとなります。繰り返しの処理を途中で中断したい場合にはbreakを使用します。

3回目のループで処理を中断

    <?php
        $i = 1;
        while( $i < 6 ) {

            if( $i == 3 ) {

                echo "3 回目のここでループが中断しました<br />¥n";

                break;
            }

            echo "$i 回目のループです。<br />¥n";

            $i++;
        }
    ?>
    

実行結果

1 回目のループです。
2 回目のループです。
3 回目のここでループが中断しました

if( $i == 3 )の条件式により、変数$iの値が3になった場合、処理が中断します。すなわち、3回目のループで中断します。

繰り返す- (2)

実行してから条件式を評価する(do...while)

do~while文も「{}(中かっこ)」によって実際に処理が走る範囲を囲います。

while文と違うところは、処理が走った後に、条件式を評価するところにあります。すなわち条件を満たしていない場合でも、必ず一度は処理が実行されます。

はじめの1回はかならず処理が走る

    <?php
        $i = 2;
        do {
              echo "$i 回目のループです。<br />¥n";

              $i++;
        } while( $i < 1 );
    ?>
    
1 回目のループです。

上記のスクリプトではwhile($i < 1)という条件は成立しませんが、一度は処理が走っています。

以下のような正式な条件にしてみます。

    <?php
        $i = 2;
        do {
              echo "$i 回目のループです。<br />¥n";

              $i++;
        } while( $i < 6 );
    ?>
    

実行結果

2 回目のループです。
3 回目のループです。
4 回目のループです。
5 回目のループです。

while( $i < 6 );の条件式により、2回目から5回目までループしています。

繰り返す- (3)

3つの式で条件を指定するfor

for文では、3つの式を組み合わせて条件を指定します。式の間には「;(セミコロンで)」区切りをつけます。

3つの式を組み合わせて条件を評価

    <?php
        for( $i = 1; $i < 6; $i++ ) {

            echo "$i 回目のループです。<br />¥n";
        }
    ?>
    

実行結果

1 回目のループです。
2 回目のループです。
3 回目のループです。
4 回目のループです。
5 回目のループです。

上記のスクリプトでは、for( $i = 1; $i < 6; $i++ )でwhile文で記述されていた、$i = 1;や$i++がまとめられて記述されているのがわかります。

for文では3つの式を組み合わせて条件を指定することができるので、コード行の長さ自体を短縮できるというメリットがあります。

なお、ループ処理で1ずつ加算していくカウンターには、慣習として「$i」という名前の変数が使われます。ループが二重、三重に入れ子で作成される場合は、「$i」、「$j」、「$k」という順で変数名をつけることが慣習となっています。

ループが入れ子で作成される例(九九)

    <?php
        for( $i = 1; $i <= 9; $i++ ) {

            for( $j = 1; $j <= 9; $j++ ) {

                echo "$i × $j = " . $i * $j . "<br />\n";
            }
        }
    ?>
    

実行結果

1 × 1 = 1
1 × 2 = 2
1 × 3 = 3



9 × 7 = 63
9 × 8 = 72
9 × 9 = 81

繰り返す- (4)

foreach

foreach文は配列用のループ処理文です。for文との違いは、for文は配列のキーが飛び飛びの数値であったり、文字列(連想配列)であった場合にはループ処理をすることができませんが、foreach文は文字列(連想配列)などでもループ処理をすることができます。

foreach( 配列 as $value )

数字が飛び飛びのループ処理

    <?php

    // 配列を生成

        $a = array(

        100 => 1000,
        150 => 1500,
        200 => 2000

        );

        foreach( $a as $value ){
          echo $value."<br />\n";
        }
    ?>
    

実行結果

1000
1500
2000

上記スクリプトでは、「array()」で配列を生成し、変数$aに代入しています。$valueには、1000、1500、2000などの値が割り当てられます。

foreachでの連想配列

foreach文での連想配列をみてみます。

foreach文での連想配列

    <?php

        $animal = array(

            "dog" => "犬",
            "cat" => "猫",
            "horse" => "馬"

        );

        foreach( $animal as $key => $value ){
            echo $key. ":" .$value."<br />\n";
        }
    ?>
    

実行結果

dog:犬
cat:猫
horse:馬

上記のスクリプトでは、「array()」で変数$animalに配列として、「"dog" => "犬","cat" => "猫","horse" => "馬"」を代入しています。そして、「foreach( $animal as $key => $value )」で、変数$animalのキーと値を変数$keyと変数$valueにそれぞれ割り当て、ループ処理をしています。

foreach文での多次元配列

配列の要素に更に配列が格納されている配列を「多次元配列」と言います。多次元配列をforeach文で扱う場合には配列を入れ子にします。

foreach文で多次元配列

    <?php
        $food = array(
            "fruit" => array(
            "strawberry"=> "いちご",
            "peach" => "もも",
            "apple" => "りんご"
        ), // ,(カンマ) で区切る
            "vegetable" => array(
            "carrot" => "にんじん",
            "pumpkin" => "かぼちゃ",
            "onion" => "たまねぎ"
            )
        );

        foreach( $food as $key1 => $valu1 ){
            echo "「".$key1. "」<br />\n";

          foreach( $valu1 as $key2 => $valu2 ){

              echo $key2. ":" .$valu2."<br />\n";
          }
        }
    ?>
    

実行結果

「fruit」
strawberry:いちご
peach:もも
apple:りんご
「vegetable」
carrot:にんじん
pumpkin:かぼちゃ
onion:たまねぎ

上記のスクリプトでは、まず一番目の「array()」で「"strawberry"=> "いちご","peach" => "もも","apple" => "りんご"」が配列として生成され、同様に二番目の「array()」で「carrot" => "にんじん","pumpkin" => "かぼちゃ","onion" => "たまねぎ"」が配列として生成され、変数$foodに代入されます。配列を入れ子にする場合は、array同士の間を,(カンマ)で区切ります。

「foreach( $food as $key1 => $valu1 )」の「$food」には上記の入れ子された配列が入っており、その入れ子された配列からキーと値が割り当てられます。「$key1」には「fruit」と「vegetable」が、「$valu1」には「いちご」「もも」「りんご」「にんじん」「かぼちゃ」「たまねぎ」が入っています。「echo "「".$key1. "」
\n";」では変数$key1の中に入ってるキーが出力されます。

「foreach( $valu1 as $key2 => $valu2 )の」$valu1には上記で説明した値が入っており、「$key2」は「strawberry」「peach」「apple」「carrot」「pumpkin」「onion」が、「$valu2」には「いちご」「もも」「りんご」「にんじん」「かぼちゃ」「たまねぎ」が入っています。そしてそれらは、foreachで要素がある分だけ繰り返されています。