第4章 様々な方法の繰り返し処理
4.2 whileとdo~while文を使ってみよう
while文とdo~while文は設定した条件を満たす間、繰り返し処理を行う制御構文です。両者の違いは繰り返す条件の判定を先に行うか後に行うかになります。
while文とdo~while文を利用する場合は、以下の違いを理解して利用する必要があります。
- while文は条件を先に判定するため、条件によっては1回も繰り返しを行わず内部の処理も実行されない場合もある。
- do~while文は条件を後に判定し、必ず1回は内部の処理を実行する。但し繰り返しは1回も行わない場合もある。
4.2.1 while文の基本的な使い方
while文は指定した条件を満たす間だけ同じ処理を繰り返します。但し条件によっては1度も繰り返し処理を行わない場合もあります。
書式:while文の基本構文while文はfor文と違い指定する式は1つだけです。また繰り返し文であるwhile文は繰り返し文を制御するための「break文」と「continue文」も当然利用できます。途中の処理結果によっては途中で抜けたり、後の処理をスキップしたりしたい場合に利用してください。
while文をフローチャートで表すと以下の図4.2.1のようになります
図 4.2.1: while文のフローチャート
ではwhile文を使ったプログラムを確認していきましょう。
whileを使って条件を満たすまで繰り返すプログラム
while文を使って条件を満たす間、メッセージ出力を繰り返す過程をWeb画面に表示します。
ソース・フォルダー: myproj_basic/ch04
パッケージ: useWhile.php
アクセスURL:http://localhost/myproj_basic/ch04/useWhile.php
useWhile.php
解説
7行目でwhile文の条件式に使用する、カウンタ変数$iを初期値1で設定しています。
8~11行目がwhile文の繰り返し処理になり、条件式には「$sumが3以下」の場合繰り返すように設定しています。
9行目は何回目のループなのかを確認するために、$iの値をメッセージと一緒に表示しています。
10行目で変数$iの値を、インクリメント演算子を利用して1増やしています。この処理があることでwhile文の判定で$iが4になった時繰り返しを終わることができます。もしも、インクリメント処理を忘れてしまうと、無限ループになってしまうので注意が必要です。
12行目はループ処理で出力したメッセージとを区別する、区切り線として表示しています。
13行目は$iの最終結果を表示しています。今回$iは1から始まり3回ループ処理を行うのため、4になって繰り返しを抜けます。実行結果も4が表示されていることから確認できます。
今回のプログラムをフローチャートに表すと以下の図のようになります。
図 4.2.2: useWhile.phpのフローチャート
今回のプログラムでの繰り返し処理は、while文を使わなくてもfor文でも記述することができます。
while文とdo~while文で無限ループを作るfor文と同じようにwhile文とdo~while文でも、条件式に「true」を設定することで無限ループさせることができますので、状況に応じて利用してみてください。
4.2.2 do~while文の基本的な使い方
前項で学習したwhile文とよく似た構文に、do~while文があります、do~while文も条件を満たす間繰り返し処理を行います。但し、while文と違い条件式の判定が繰り返す対象の処理よりも後のため、条件式の結果に関わらず必ず1回は繰り返し内の処理を行うことになります。
書式:do~while文の基本構文
while文同様に繰り返し文を制御するための「break文」と「continue文」も利用できます。
while文をフローチャートで表すと以下の図4.2.3のようになります
図 4.2.3: do~while文のフローチャート
do~while文のフローチャートを見て分かると思いますが、繰り返す処理が行われてから条件式の判定を行っています。この条件式を判定するタイミングの違いにより、while文では条件によっては1度も内部の処理を行わないことがありますが、do~while文では条件に関わらず1度は内部の処理が実行されます。
それでは、do~while文を使ったサンプルを確認していきましょう。
do~whileを使って条件を満たすまで繰り返すプログラム
do~while文を使って条件を満たす間繰り返すことを、Web画面に結果を表示しながら確認していきます。
ソース・フォルダー: myproj_basic/ch04
パッケージ: useDoWhile.php
アクセスURL:http://localhost/myproj_basic/ch04/useDoWhile.php
useDoWhile.php
解説
このプログラムは前項のプログラムをdo~while文に書き換え、出力するメッセージを変更した内容になっています。3回ループして抜ける繰り返し動作は変わりません。
7行目でdo~while文の条件式に使用する、カウンタ変数$iを初期値1で設定しています。
8~11行目がdo~while文の繰り返し処理になり、条件式には「$iが3以下」の場合繰り返すように設定しています。
9行目は何回目のループなのかを確認するために、$iの値をメッセージと一緒に表示しています。
10行目で変数$iの値を、インクリメント演算子を利用して1増やしています。
前項のwhile文の処理をdo~whileに変更した内容になっています。
12行目はループ処理で出力したメッセージとを区別する、区切り線として表示しています。
13行目は$iの最終結果を表示しています。今回$iは1から始まり3回ループ処理を行うのため、4になって繰り返しを抜けます。実行結果も4が表示されていることから確認できます。
今回のプログラムをフローチャートに表すと以下の図のようになります。
図 4.2.4: useDoWhile.phpのフローチャート
前項と今回のプログラムを見ても処理内容が同じになっているため、while文とdo~while文の違いが分かり難くなっています。そこで条件式を初めから満たしていない場合で、繰り返し処理の動作に違いがでるかを次のプログラムから確認していきましょう。
while文とdo~whileの動作の違いを確認するプログラム
while文とdo~while文に初めから条件式が満たされていない設定を行い、両者の違いをWeb画面に結果を表示しながら確認していきます。
ソース・フォルダー: myproj_basic/ch04
パッケージ: diffLoop.php
アクセスURL:http://localhost/myproj_basic/ch04/diffLoop.php
diffLoop.php
解説
このプログラムは同じ条件式でwhile文とdo~while文が記述されており、どちらも最初の条件式の判定で成立しないようになっています。
7行目でカウンタ変数$iに、両方の繰り返し処理の条件を満たせない値4を初期値として設定します。
10~13行目がwhile文になりますが、10行目の条件式は$iが3以下の場合繰り返しますが、カウンタ変数$iの初期値は4になっているため内部の処理は行わず、そのままwhile文を抜けます。
続いて17~20行目がdo~while文になります。while文と違い条件式の判定は後なので、条件式の結果に関わらず内部の処理が1回実行されます。条件式は満たせていないので、内部の処理を1回実行して、そのままdo~while文を抜けます。
実行結果からも確認できますが、条件式が初めから満たされないwhile文ではメッセージの出力はなく、do~while文では1回出力されているのが確認できます。この条件式の判定タイミングがwhile文とdo~while文の違いになります。