第10章 同じ処理を繰り返そう

10.2 for文を使って繰り返してみよう

繰り返し処理で基本の「for(フォー)文」について学習していきます。for文は、主に繰り返し回数が決まっている場合に利用します。

10.2.1 for文の使い方

for文はこれまでの仕組みと異なり、3つの式が1セットで構成されます。式1と式2の後に「;」で区切る必要があります。

書式:for文

凡例:for文

基本的なfor文は凡例で示した形になります。①式1ではカウンタ変数($i)と呼ばれる変数を1つ作成し、それを③式3でインクリメントしたりデクリメントすることによって、②式2の条件を満たしている間繰り返すことができます。各式の役割の詳細を以下に示します。

①式1:初期化の式

式1はループ開始時に「1回だけ処理」され、カウンタ変数の初期化を行います。凡例のように「$i=0;」と記述すると、0から繰り返す回数を数えていきます。また記述の最後に必ず「;」を付ける必要があります。

②式2:反復条件の式

式2には、繰り返すための「条件(回数)」を設定します。そのため基本的には凡例のような「$i<10;」、カウンタ変数と比較演算子を使った式が入ります。式1同様に記述の最後は必ず「;」を付けます。
凡例の場合、変数$iは0から開始しているので、0、1、2、…9と10回繰り返した後、$iが10になった時に条件に当てはまらなくなり、繰り返し処理が終了します。

③式3:繰り返し後の操作の式

式3は繰り返す処理(forブロック内の処理)が「1回終わる毎に必ず実行」されます。凡例のように「$i++」、カウンタ変数の値の操作を行います。式1、2と違い最後に「;」は必要ないので注意してください。

for文をフローチャートで表すと、以下の図10.2.1になります。フローチャートを見て分かるように式1は1回だけ処理され、式3は必ずループ毎に処理されているのが確認できます。


図 10.2.1: for文のフローチャート

for文を利用して繰り返しメッセージ表示処理を行わせるプログラム

繰り返し文を利用して同じメッセージ複数回表示できることを、Webブラウザから確認してみましょう。

ソース・フォルダー: myproj_intro/ch10
パッケージ: forLoop.php
アクセスURL:http://localhost/myproj_intro/ch10/forLoop.php

forLoop.php

実行結果

解説

7~9行目がfor文になります。今回の処理は「流れ星に願いを!」のメッセージを3回画面に表示する動作になっています。

今回のfor文の式は以下のように設定されています。

式1:カウンタ変数の初期化

for文の処理に入る時に1度だけ行われる処理で、変数$iを0で初期化します。0以外からカウントしても大丈夫ですが、プログラムでは配列の添え字のように、0基点の数え方を利用するのが一般的です。

式2:繰り返し処理に入る条件

繰り返しが行われる条件として、$iが3未満(2以下)と設定します。

式3:繰り返し後の操作

繰り返し処理が1回行われる毎に、変数$iをインクリメント(1増やす)を設定します。操作はインクリメントだけではなく計算式($i+=2)も記述できるので、任意の数で増加させていくこともできます。

繰り返しの対象処理

forブロックに囲まれた範囲の処理全てが繰り返しの対象になります。今回は「流れ星に願いを!」というメッセージを出力する処理のみが対象になります。forブロック内に記述できる処理は、メッセージ出力だけではなく、これまで学習してきた計算、条件分岐、さらには繰り返し処理(for文のネスト:多重ループ)も記述できます。

ポイント
  • for文は、「カウンタ変数の宣言と初期化」、「繰り返し処理に入る条件」、「繰り返し処理後の操作」という3つの式を設定することで繰り返し処理の回数を指定することができる。

今回の各式の設定を踏まえて、for文の動きを1つ1つ確認していきましょう。

7~9行目のfor文の各処理の順番を付けると以下のようになります。



今回の処理をフローチャートで表すと以下のようになります。

図 10.2.2: forLoopのフローチャート

10.2.2 for文のカウンタ変数を使う

for文の式1でカウンタ変数を用意したと思います。この変数は繰り返しのカウント数をただ管理するだけではなく、forブロック内と繰り返し終了後にも利用することができます。

凡例:カウンタ変数を処理に利用

さっそくプログラムで確認してみましょう。

for文のカウンタ変数を利用して計算を行わせるプログラム

繰り返し処理のカウンタ変数を繰り返し中に利用し1~5の総計を求めた結果と、さらに繰り返しが終わった後のカウンタ変数の値を表示してWebブラウザから確認してみましょう。

ソース・フォルダー: myproj_intro/ch10
パッケージ: useCounter.php
アクセスURL:http://localhost/myproj_intro/ch10/useCounter.php

useCounter.php

実行結果

解説

9~12がfor文になります。今回は式1で「$i=1で1からカウントを取る」、式2では「$i<=5と$iが5以下なら繰り返す」、式3は「$i++で$iの値を1ずつ増やす」ように設定しています。結果としては、「$iが1~5と変化していき5回forブロック内の処理を繰り返す」ことになります。
10行目の処理はカウンタ変数$iの値を画面に表示しています。(表の囲み点線枠の※①)
11行目の処理は変数$totalに、カウンタ変数$iの値を加算代入しています。

今回の繰り返し処理のデータ変化の流れを、以下の表に示します。

13行目で最終的な「$iの値6」(※③)と、繰り返しで求めた1~5の総和の結果「$totalの値15」(※②)を画面に表示しています。

今回の実行結果から、繰り返し処理内と処理後でカウンタ変数を利用することが確認できました。このカウンタ変数を上手に使うことで、さらに処理できることのバリエーションを増やすことができます。

ポイント
  • 繰り返し処理のカウンタ変数はループの条件判定だけでなく、値そのものを処理に利用できる。

続いて、繰り返し処理と配列を連携させる仕組みについて学習していきましょう。

10.2.3 繰り返し処理と配列の連携

大量のデータを管理する配列と繰り返し処理を組み合わせると、簡単かつ大量にデータの出し入れを行うことができます。前項で学習した繰り返し処理の「カウンタ変数の利用」と、配列の「添え字には変数が利用できる」ことを思い出すと気づいたのではないでしょうか。

早速プログラムで確認してみましょう。

for文と配列を組み合わせて利用するプログラム

配列変数に用意したデータの教科名と点数を繰り返し文を利用して画面に表示し、さらに合計点を求めその結果と平均点の結果をWebブラウザから確認してみましょう。

ソース・フォルダー: myproj_intro/ch10
パッケージ: useArrayToLoop.php
アクセスURL:http://localhost/myproj_intro/ch10/useArrayToLoop.php

useArrayToLoop.php

実行結果

解説

7、8行目で今回のプログラムに使用する教科名と、その点数を配列変数に用意しています。arrayは文字キーの指定が無い場合、「0番から」数値キーを割り当てます。


図 10.2.3: 配列データの格納状況

11~15行目が今回のfor文になります。式1は「$i=0として0からカウントを取る」、式2は「$i<5として$iが5未満なら繰り返す条件」、式3は「$i++としてカウンタ変数の値を1ずつ増やす」設定になっています。結果としては、「$iが0~4と変化していき5回forブロック内の処理を繰り返す」ことになります。
13行目の処理で「配列の添え字にカウンタ変数$iを利用」して、配列内全データを画面に表示しています。
14行目は変数$totalに配列データを加算代入しています。ここでも配列の添え字にカウンタ変数$iを利用しています。

今回の表は13行目の処理を例に示します。

表の流れを見ると、1回目のループでは配列の添え字に入るのは「0」、2回目は「1」…5回目は「4」と増えていっているの確認できます。繰り返し処理のカウンタ変数が1ずつ増えることで、配列の添え字と合致して全てのデータが参照できる仕組みになります。

17行目では平均点を$total/5で計算し、変数$averageに代入しています。

19行目では繰り返し処理で求めた合計値、20行目では計算で求めた平均値を画面に表示しています。

実行結果から分かるように、繰り返しと配列を組み合わせることで簡単に全てのデータを表示したり、各点数の合計を求めることができました。

ポイント
  • 繰り返し処理と配列を組み合わせると、簡単に大量のデータの出し入れを行える。
繰り返し処理で気をつけること

繰り返し処理で気をつけることは、「いつまで処理を繰り返すのか?」という条件のことです。繰り返し条件を間違ってしまうと、永久に処理を繰り返してしまいます。永久ループはコンピュータに多大な負荷がかかり、他のプログラムが動作できなくなります。
意図しない永久ループは避けなければなりませんが、プログラミングのテクニックとして、わざと永久ループを作成する場合もあります。ある条件を満たせば、永久ループを終わらせる仕組みを入れておけば決して危険なものにはなりません。また永久ループのことを無限ループとも呼びます。

参考:for文で無限ループの設定方法
各式は設定せずにセミコロンを2つだけ記述すれば、無限ループを作成することができます。

NEXT>> 10.3 foreach文を使って配列を処理しよう