10日で覚えるPHPのキソ 第 6 回 繰り返し
第 6 回は、制御文の繰り返しについてお話します。
プログラムでは、同じような処理を繰り返すことがよくあります。(繰り返しのことを「ループ」と言います。)
代表的なものは、以下の3つです。
- for
- while
- foreach
それでは、for文から説明いたします。
for
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重ループと言います。
実際にプログラムを書いてみましょう。
<?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
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文も同じく繰り返しを行う制御文です。
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
for文では繰り返す数をあらかじめ決めて処理を行いました。
while文では、条件を指定し、その条件に合う間は処理が行われました。
foreach文では、配列の要素の数だけ処理が繰り返されます。
(要素の数だけ処理を繰り返し、自動的にとまります。)
foreachの書き方は2通りあります。
- foreach ($array as $value) { 処理 }
- foreach ($array as $key => $value) { 処理 }
ここでは$arrayがループさせたい配列。
$keyが添字(キー)、$valueが要素を格納する変数です。
処理内で添字(キー)を使用しない場合には、1の書き方がよいでしょう。
(ここでは$key・$valueとしていますが、命名は基本的に自由です。)
直感的には分かりにくいかもしれません。
例えば、以下のような配列があります。
この配列を、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
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
実行中のループ処理を中断する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
次回は関数についてお話します。
■ 用語集
■ 参考サイト・文献