10日で覚えるPHPのキソ 第 6 回 繰り返し

No Photo

第 6 回は、制御文の繰り返しについてお話します。
プログラムでは、同じような処理を繰り返すことがよくあります。(繰り返しのことを「ループ」と言います。)
代表的なものは、以下の3つです。

  • for
  • while
  • foreach

それでは、for文から説明いたします。

for

080430_ichikawa_php06_01.gif

for文は、カウンターのようなものを用意して、その値によって何回繰り返すかが決まります。
図の例では、$i(カウンター)の初期値を0として、1つずつ値を増やしていき、3以下であるという条件に合う間は処理を繰り返し実行します。

プログラムの処理の流れとしては…

  • まずfor文にたどり着くと初期化式が実行されます。
    ($i = 0;の部分が実行される)
  • その後に、ループを行うかどうかを条件式を見て判定します。
    ($i <= 3の条件が正しければ処理を実行、正しくなければ処理をせずループを抜けます。)
  • ループの中の処理が最後まで達すると、for文の行に処理遷移が戻り、更新式($i++)が実行されます。
    (インクリメント演算子++によって、$iの値が1つ増えます。)
  • 2回目以降のループは、更新式($i++)の実行後に条件判定が行われ、条件に一致しなくなった時にループを抜けます。

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

<?php
    for ($i = 0; $i <= 3; $i++) {
        print '$iの値は'.$i.'です<br />';
    }
?>

ブラウザの表示は…

$iの値は0です
$iの値は1です
$iの値は2です
$iの値は3です

for文を2つ使って、繰り返しの中に繰り返しを書くこともできます。
これを2重ループと言います。

080430_ichikawa_php06_02.gif

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

<?php
    // 外側のループ
    for ($a = 0; $a <= 3; $a++) {
        print '■ここは外側のループです。';
        print '$aの値は'.$a.'です<br />';

        // 内側のループ
        for ($i = 0; $i <= 3; $i++) {
            print '○ここは内側のループです。';
            print '$iの値は'.$i.'です<br />';
        }
    }
?>

ブラウザの表示は…

■ここは外側のループです。$aの値は0です
○ここは内側のループです。$iの値は0です
○ここは内側のループです。$iの値は1です
○ここは内側のループです。$iの値は2です
○ここは内側のループです。$iの値は3です
■ここは外側のループです。$aの値は1です
○ここは内側のループです。$iの値は0です
○ここは内側のループです。$iの値は1です
○ここは内側のループです。$iの値は2です
○ここは内側のループです。$iの値は3です
■ここは外側のループです。$aの値は2です
○ここは内側のループです。$iの値は0です
○ここは内側のループです。$iの値は1です
○ここは内側のループです。$iの値は2です
○ここは内側のループです。$iの値は3です
■ここは外側のループです。$aの値は3です
○ここは内側のループです。$iの値は0です
○ここは内側のループです。$iの値は1です
○ここは内側のループです。$iの値は2です
○ここは内側のループです。$iの値は3です

次に、while文を説明いたします。

while

080430_ichikawa_php06_05.gif

while文は、ある条件が成り立っている間だけ処理を繰り返し実行します。
for文と違う点は、カウンターにあたるものがなく、条件判定を行う変数は繰り返しの処理の中で変化させてループ回数を制御します。

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

<?php
    $a = 0;

    while ($a < 5) {
        print '$aの値は'.$a.'です。<br />';
        $a++;
    }
?>

ブラウザの表示は…

$aの値は0です。
$aの値は1です。
$aの値は2です。
$aの値は3です。
$aの値は4です。

「$aが5より小さい」という条件に合う間は繰り返しの処理が実行されます。
処理の後に演算子++によって、値が出力された後に加算が行われ、値に1が足されます。

while文の繰り返しは、ほとんどの場合for文で書くこともできます。
変化させた値によってループの回数を変えたい場合は、while文を使うのがよいでしょう。
(「無限ループ」「break」に関して詳しくは、後程解説いたします。)

<?php
    $a = 1;

    // この条件式は無限ループになります。
    while (true) {

        // $aが10より大きい時に、処理を抜けます。
        if ($a > 10) {
            break;
        }

        // $aを2で割って余りがない時に表示します。
        if ($a % 2 == 0) {
            print '$aは偶数です。値は'.$a.'です<br />';
        }

        $a++;
    }
?>

ブラウザの表示は…

$aは偶数です。値は2です
$aは偶数です。値は4です
$aは偶数です。値は6です
$aは偶数です。値は8です
$aは偶数です。値は10です

do~while文も同じく繰り返しを行う制御文です。

080430_ichikawa_php06_06.gif

while文では条件が先にあるので、その条件に合わなければ1度も処理をしません。
do~while文では、条件を下に書くため、必ず1度は処理を実行します。

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

<?php
    $a=1;
    while ($a > 10) {
        print "while文実行".$a."回目<br />";
        $a++;
    }

    $a=1;
    do {
        print "do-while文実行".$a."回目<br />";
        $a++;
    } while ($a > 10);
?>

ブラウザの表示は…

do-while文実行1回目

$aは1が代入されているので、10より大きいという条件文には合いません。
条件文に合わない場合、whileでは繰り返しの処理に入りません。
do~while文では、条件文に合わなくても必ず1回は処理されます。

  • 無限ループに注意

whileなどの繰り返し制御文では、常に成立するような条件を間違って指定してしまうと、処理を永久に繰り返してしまいます。
これを無限ループといい、プログラムのバグ(不具合)となる原因の一つです。
無限ループにならないように、条件と繰り返し処理の内容に注意しましょう。

下記プログラムは無限ループになります。

<?php
    $a = 0;

    while ($a < 5) {
        print "これは無限ループになります。";
    }
?>

例えば、繰り返しの処理の中で、$a++;などとして$aの値を増やさなければならないところを記述し忘れたとします。
$aの値は変わらず、常に条件である「5より小さい」に当てはまるため、ループを抜けることができず無限ループとなっています。

次にforeachについて説明いたします。

foreach

080430_ichikawa_php06_03.gif

for文では繰り返す数をあらかじめ決めて処理を行いました。
while文では、条件を指定し、その条件に合う間は処理が行われました。
foreach文では、配列の要素の数だけ処理が繰り返されます。
(要素の数だけ処理を繰り返し、自動的にとまります。)

foreachの書き方は2通りあります。

  1. foreach ($array as $value) { 処理 }
  2. foreach ($array as $key => $value) { 処理 }

ここでは$arrayがループさせたい配列。
$keyが添字(キー)、$valueが要素を格納する変数です。
処理内で添字(キー)を使用しない場合には、1の書き方がよいでしょう。
(ここでは$key・$valueとしていますが、命名は基本的に自由です。)

直感的には分かりにくいかもしれません。
例えば、以下のような配列があります。

080430_ichikawa_php06_04.gif

この配列を、foreach文を使って繰り返し処理を実行してみましょう。

<?php
    // 図のような配列を作ります。
    $shiki = array(
                "spr" => "春",
                "sum" => "夏",
                "aut" => "秋",
                "win" => "冬",);

    // 配列の添字と値を繰り返し処理で表示します。
    foreach ($shiki as $key => $name) {
        print $key."は".$name."<br />";
    }
?>

ブラウザの表示は…

sprは春
sumは夏
autは秋
winは冬

上の図の配列$shikiは、4つの要素で構成されています。
foreachの繰り返し処理では、配列の要素がばらされて1つ1つが順番にforeachの中に入り処理されるイメージです。
foreachのあとの()の中で、そのばらされた要素の添字を$keyとし、要素を$nameと指定しています。

以上が繰り返しの制御文です。
次に繰り返しを中断する制御文を説明いたします。

代表的なものは、以下の2つです。

  • break
  • continue

まずは、break文から説明いたします。

break

080430_ichikawa_php06_07.gif

for文やwhile文などの繰り返しを途中で中断するにはbreak文を使います。
プログラム実行中にbreak文があると、一番近いブロックの終わりにジャンプします。

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

<?php
    $a = 0;

    while ($a < 10) {
        if ($a == 5) {
            break;
        }
        print '$aの値は'.$a.'です。<br />';
        $a++;
    }
?>

ブラウザの表示は…

$aの値は0です。
$aの値は1です。
$aの値は2です。
$aの値は3です。
$aの値は4です。

繰り返し処理の中で、$aが5の時、breakで処理を中断しています。
このように、繰り返しの処理の途中でもbreak文によって処理を中断する事ができます。

次に、continue文を説明いたします。

continue

080430_ichikawa_php06_08.gif

実行中のループ処理を中断するbreak文に対し、continue文は、繰り返しのその回の処理を中断し、次の回から実行します。

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

<?php
    $a = 0;

    while ($a < 5) {
        print '最初の$aの値は'.$a.'です。<br />';
        $a++;
        print '++演算子で$aの値は'.$a.'になりました。<br />';

        // 奇数だったらという条件
        if ($a % 2 == 1) {
            print 'continueでこの処理を中断し、次の回の繰り返しを実行<br /><br />';
            continue;
        }

        print '最後の$aの値は'.$a.'です。<br /><br />';
    }
?>

ブラウザの表示は…

最初の$aの値は0です。
++演算子で$aの値は1になりました。
continueでこの処理を中断し、次の回の繰り返しを実行

最初の$aの値は1です。
++演算子で$aの値は2になりました。
最後の$aの値は2です。

最初の$aの値は2です。
++演算子で$aの値は3になりました。
continueでこの処理を中断し、次の回の繰り返しを実行

最初の$aの値は3です。
++演算子で$aの値は4になりました。
最後の$aの値は4です。

最初の$aの値は4です。
++演算子で$aの値は5になりました。
continueでこの処理を中断し、次の回の繰り返しを実行

$aが5より小さい間は繰り返すという制御文の中で、$aが奇数の時にはその回だけの処理を中断しています。
「最後の$aの値は…」と表示されるのは、処理が中断されなかった$aが偶数の時だけです。

第 6 回まとめ

繰り返しの制御文

  • for
  • while
  • foreach

繰り返しを中断する制御文

  • break
  • continue

次回は関数についてお話します。

■ 用語集

■ 参考サイト・文献

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

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