前回は、条件に従って処理を分岐させるif文を解説した。
その中で使用する真偽値も同時に解説を行った。
真偽値は今回の内容にも出てくるので、不安な方は復習をしておこう。
以下がその記事だ。
【PHP講座06】if文で条件によって処理を分岐させよう | Shino’s Mind Archive
さて、今回はタイトルにある通り、繰り返し処理を3種類紹介する。
具体的には、以下3つの文だ。
- while文
- for文
- foreach文
それぞれ特徴が異なるので、そこを意識して見ていこう。
while文で行う繰り返し処理
早速一つ目、while文の解説に入ろう。
先に、書き方を。
while(真偽値){
// 真偽値がtrueなら繰り返し行う処理
}
前回のif文のうち、if
と書いていた部分がwhile
に変わっただけだ。
ただ、動き方は以下のように変わる。
- 真偽値を見て、
true
なら中括弧内の処理を行う - 中括弧の処理が終わったら、再度真偽値を見る
- 真偽値が
true
なら、中括弧内の処理を行う - 中括弧の処理が終わったら、再度真偽値を見る
- …
- 真偽値が
false
なら、while文を終了して中括弧以降の処理に進む
つまり、真偽値を確認し、true
なら繰り返し中括弧内の処理を行うようになる。
そして、false
ならその繰り返しを終え、次に進む。
具体例を見てみよう。
以下のプログラムを実行してみてほしい。
<?php
$num = 1;
while($num <= 5){
echo $num . "回目の繰り返しです。";
echo "<br>";
$num += 1;
}
echo "繰り返しが終了しました。";
?>
この結果は、以下のようになるはずだ。
1回目の繰り返しです。
2回目の繰り返しです。
3回目の繰り返しです。
4回目の繰り返しです。
5回目の繰り返しです。
繰り返しが終了しました。
サンプルソースの中、3行目からwhile文になっている。
このときの動作を以下に並べてみよう。
行番号 | $numの値 | 処理内容 |
---|---|---|
2 | 1 | $num に値1を代入 |
3 | 1 | $num <= 5 の結果true なので繰り返し処理内へ |
4, 5 | 1 | 文字列の出力 |
6 | 1 → 2 | $num に1加算、中括弧処理が終わりなので3行目へ |
3 | 2 | $num <= 5 の結果true なので繰り返し処理内へ |
4, 5 | 2 | 文字列の出力 |
6 | 2 → 3 | $num に1加算、中括弧処理が終わりなので3行目へ |
… | … | … |
6 | 5 → 6 | $num に1加算、中括弧処理が終わりなので3行目へ |
3 | 6 | $num <= 5 の結果false なので繰り返し処理終了、8行目へ |
8 | 6 | 文字列の出力 |
このように処理が進んでいく。
なお、一回目の真偽値チェックでいきなりfalse
になったら、一回も中括弧の処理が行われることなく次に進むので、それも注意しよう。
このwhile文は、特定の条件によって繰り返しをするかどうか判定したい場合に使いやすい。
今この段階では何を当たり前のことを言っているんだと思われそうだが、この意味は次のfor文を見れば分かると思う。
一個オマケで解説を。
PHPの実行結果はHTMLとして返されると解説したと思う。
つまり、改行もHTMLの書き方に則らなければいけない。
ということで、繰り返し処理の中で<br>
を出力して改行している。
このように、PHPの出力でHTMLタグを書くことも可能なので、覚えておこう。
for文で行う繰り返し処理
次に、for文を見ていこう。
while文と同じように、先に書き方を。
for(前処理; 真偽値; 後処理){
// 繰り返し行う処理
}
今度は小括弧内に書く内容が増えた。
処理の流れがちょっと複雑なので、丁寧に見ていこう。
- for文の処理に来たら、まず前処理を行う
- 次に、真偽値を見て
true
なら中括弧内の処理へ、false
ならfor文終了 - 中括弧内の処理を行う
- 処理を終えたら、後処理を行う
- 真偽値を見て
true
なら中括弧内の処理へ、false
ならfor文終了 - 中括弧内の処理を行う
- 処理を終えたら、後処理を行う
- 真偽値を見て
true
なら中括弧内の処理へ、false
ならfor文終了 - …
このような流れになる。
つまり、while文に以下2つが追加されたイメージだ。
- 最初一回だけ前処理を行う
- 繰り返し処理終了ごとに後処理を行う
というわけで、こちらも具体例を。
上のwhile文と同じ表示をするプログラムを、for文を使って書いてみよう。
<?php
for($num = 1; $num <= 5; $num++){
echo $num . "回目の繰り返しです。";
echo "<br>";
}
echo "繰り返しが終了しました。";
?>
実行結果はsample14.phpと全く同じだ。
さて、一個見慣れないものが出てきている。
for文の後処理のところに書かれている$num++
というやつだ。
これはインクリメントと言って、整数が入った変数の値を1増やす処理になる。
書き換えると、$num += 1
や、$num = $num + 1
と全く同じ処理をしている。
特にfor文の後処理でよく使うのでこれも覚えておいて欲しい。
このfor文は、繰り返す回数がすでに分かっている場合に効果的だ。
これで、while文の特徴の意味が分かっただろうか。
例を出すと、値$num
の数が増えていくような計算をするときに…
- 一定の大きさまで計算する場合はwhile文
- 一定の回数だけ計算する場合はfor文
を使った方がやりやすいということだ。
もちろん、書き方によってはどちらも使えるので、使いやすい方を使っていこう。
foreach文で行う繰り返し処理
三つ目、foreach文に進んでいこう。
これは、配列に特化した繰り返し処理だ。
配列って何だっけ?という方は以下で解説しているので、先に復習しておこう。
【PHP講座04】配列とは?使い方を解説! | Shino’s Mind Archive
では、こちらも先に書き方を見ていこう。
foreach(配列変数 as $key => $value){
// 配列の要素ごとに行う処理
}
このforeach文は、配列の要素ごとに繰り返し処理を行うことができる。
小括弧の中には3種類のものを書く。
一つ目は、繰り返し処理を行う配列を。
二つ目は、その添え字が$key
という変数に入る。
三つ目は、その中に入っている要素が$value
という変数に入る。
なお、$key
や$value
は別の名前でも大丈夫だ。
状況によって変数名を変えよう。
これで、一回の繰り返しごとに$key
や$value
に配列の情報が入り、繰り返し処理が行われる。
具体例で、実際の動きを見ていこう。
以下のサンプルプログラムを見て欲しい。
<?php
$arr = [10, 20, 30, 40];
foreach($arr as $key => $value){
echo $key . "番目の要素は" . $value . "です。";
echo "<br>";
}
echo "foreach文が終了しました。";
?>
先に、4つの要素を持つ配列を用意して、それを使ってforeach文を書いている。
このforeach文の動きを表にまとめてみた。
行番号 | $keyの値 | $valueの値 | 処理内容 |
---|---|---|---|
3 | 0 | 10 | 一つ目の要素の情報を$key , $value に入れて中括弧内の処理へ |
4, 5 | 0 | 10 | 文字列の出力 |
3 | 0 → 1 | 10 → 20 | 二つ目の要素の情報を$key , $value に入れて中括弧内の処理へ |
4, 5 | 1 | 20 | 文字列の出力 |
3 | 1 → 2 | 20 → 30 | 三つ目の要素の情報を$key , $value に入れて中括弧内の処理へ |
4, 5 | 2 | 30 | 文字列の出力 |
3 | 2 → 3 | 30 → 40 | 四つ目の要素の情報を$key , $value に入れて中括弧内の処理へ |
4, 5 | 3 | 40 | 文字列の出力 |
3 | 3 | 40 | 次の配列の要素がないのでforeach文終了、7行目へ |
7 | – | – | 文字列の出力 |
このように、配列の各要素に対して処理を行うことができるのだ。
連想配列の場合には、しっかり$key
にその文字列が入ってくれる。
なかなかに便利なので、是非覚えておいて欲しい。
なお、添え字が要らないという場合には、そこを省略して以下のようにも書ける。
foreach(配列変数 as $value){
// 配列の要素ごとに行う処理
}
中身だけ使いたい場合には、こちらを使うようにしよう。
このforeach文の特徴は、言うまでもなく配列との相性の良さだ。
配列の各要素に対して行う処理は、これを使っていこう。
繰り返し処理の共通事項
最後に、繰り返し処理共通で使えるものや、気を付けないといけないことがあるので、それを見ていこう。
その回の繰り返し処理を終わらせるcontinue文
使えるもの一つ目だ。
条件によって、その回の繰り返し処理をスキップさせる、といったことができる。
例えば、for文のサンプルを以下のように書き換えてみよう。
<?php
for($num = 1; $num <= 5; $num++){
if($num % 2 == 0){
continue;
}
echo $num . "回目の繰り返しです。";
echo "<br>";
}
echo "繰り返しが終了しました。";
?>
3行目から5行目に、一つif文を追加した。
この条件に使っている%
は、余りを求める計算だ。
これも言語に限らずよく使うので覚えておこう。
さて、ここで$num
を2で割った余りが0だったら、continue
を実行するようにしてある。
このようにcontinue
を実行すると、その回の処理が終わったとして後処理が行われ、再度真偽値の判定が行われる。
このサンプルへのアクセス結果は以下の通り。
1回目の繰り返しです。
3回目の繰り返しです。
5回目の繰り返しです。
繰り返しが終了しました。
偶数の場合には、出力が飛ばされているのが分かる。
特定の条件で処理を中断したい場合に使えるのだ。
もちろんfor文だけでなく、while文やforeach文でも使える。
繰り返し処理自体を終わらせるbreak文
これも使えるもの。
今度は、繰り返し処理自体を終わらせてしまうものだ。
今度はwhile文を書き換えてみよう。
<?php
$num = 1;
while($num <= 5){
echo $num . "回目の繰り返しです。";
echo "<br>";
$num += 1;
if($num == 3){
break;
}
}
echo "繰り返しが終了しました。";
?>
今度は、$num
が3だったらbreak
を実行している。
これが実行されると、問答無用で繰り返し処理が終了する。
結果も、以下のようになる。
1回目の繰り返しです。
2回目の繰り返しです。
繰り返しが終了しました。
これもfor文、foreach文でも使用可能だ。
無限ループ
これは気を付けないといけないもの。
無限ループはその名の通り、条件が常にtrue
になって、延々と処理を繰り返してしまうこと。
極端に書くと、以下のような感じだ。
while(true){
// 処理
}
こうしてしまうと、ずっと繰り返し処理をしてしまう。
通常の言語であれば、強制終了するしかなくなってしまうので気を付けよう。
とはいえ、中にif文で分岐し、break
を実行するという手法を使う場合もある。
とにかく、繰り返しを終了する条件がしっかり設定されているか、という点に気を付けよう。
なお、PHPの場合は一定時間経過しても処理が終了しない場合に、エラーとして強制的に終了する仕組みが存在する。
デフォルトでは30秒で、その際に出てくるエラーメッセージは以下の通り。
Fatal error: Maximum execution time of (秒数) seconds exceeded in (ファイル名) on line (行番号)
これが出た場合には、行番号のところで無限ループが発生していないか確認してみよう。
一つ余談だが、本講座で紹介した環境では、デフォルトの時間が120秒になっていた。
30秒は教本や調べて出てきた数字だが、どうやら環境によってデフォルトの時間も違うらしい。
この設定は、php.iniというファイルで設定を変更することができる。
本講座で紹介した環境のデフォルトファイルパスはC:\xampp\php\php.ini、以下の項目だ。
max_execution_time=(秒数)
変更したい場合は、この秒数のところを変更しよう。
なお、こういった設定ファイルを変更する場合は、必ず元のファイルのバックアップを取っておこう。
上手く動かなくなったときに、元に戻すためだ。
場合によっては起動すらしなくなってしまうこともあるので、変更は慎重に。
おわりに
今回は、繰り返し処理を行う三つの文を紹介した。
特定の条件がtrue
である間繰り返しを行うwhile文、前処理と後処理を追加したfor文、配列の要素ごとに処理を行うforeach文だ。
それぞれの書き方、特徴をしっかり押さえておこう。
さて、次回は関数を解説する。
ここから一気に自由度が上がっていくので、しっかりマスターしていこう。
コメント