先日発見した、私がプログラム業界へ入った時のノートを元にした
プログラミング勉強ノートの続きです。
PHPプログラミングの基礎はコチラから↓
【PHP】プログラミング勉強ノート(基礎から条件分岐まで)
配列についても纏めました。
【PHP】プログラミング勉強ノート(配列,連想配列)
引き続き、私がプログラムの業界へ入った時のノートを清書しながら
初心に戻ったつもりでPHPの基本的な事を解説して行きます。
今回は、プログラムの繰り返し処理を行なう制御構文について解説します。
プログラムの管理を楽にする制御構文
通常、プログラムというものは、テキスト上の上から下へ向かって処理が流れて行きます。
しかし、中には繰り返し同じ処理を行ないたい時もあります。
例えば、五回メッセーッセージを出力したい場合、
echo "1回目のメッセージです"; echo "2回目のメッセージです"; echo "3回目のメッセージです"; echo "4回目のメッセージです"; echo "5回目のメッセージです";
の様に記述する事も可能ですが、面倒ですよね?
まだ五回だから良いですが、例えば0から100まで数えながらメッセージを出力する場合など、
echo文を100個書いても良いですが、中々大変です。
では1000回ではどうでしょう?10000回ならどうでしょう?
数が増えれば増える程負担が大きくなります。
更に、何とか10000回書いたとして、では『偶数と奇数でメッセージを変えましょう』とか
『10ずつのメッセージにしましょう』といった仕様変更があった場合に、
手作業で一つづつ修正するのも大変です。こういった仕様変更が何回行なわれるかもわかりません。
ですので、上記の記述の仕方では、仕様変更に耐えられず、保守性に乏しいコードになってしまいます。
上記の例を見ますと、違いは何回目なのかを表す数字だけです。
他は同じ事の繰り返しです。
そうです。こういった繰り返し同じ処理を行なう時に、
繰り返し処理を行なう制御構文が役に立ちます。
繰り返し制御構文のfor()でインクリメント
先程の例の問題点を解決する関数として、繰り返し制御構文の『for()』を使用します。
『for()』は初期化と条件、繰り返す際に実行する内容をを同時に指定する事が出来ます。
記述方法は下記の通りです。
for(初期化;条件;実行){ 繰り返し処理 }
『初期化』の部分には、繰り返しを行なう際に使用する変数等の初期化を行ないます。
『条件』の部分には、繰り返す為の条件を指定します。条件に反した場合に繰り返しは終了します。
『実行』の部分には、次の繰り返しに移る前に処理すべき実行を記述します。
『繰り返し処理』の部分には、繰り返したい処理を記述します。
では、先程の例を元に、0から100まで数えながらメッセージを出力するプログラムを記述してみましょう。
for( $count=0; $count<=100; $count++ ){ echo $count."回目のメッセージです"; }
大分スッキリしました。
では分解して解説して行きます。
『初期化』の部分には、$countという変数へ0を代入する事で$countを初期化しています。
『条件』の部分には、繰り返しを行なう条件として、『$countが100以下なら繰り返す』と指定しています。
『実行』の部分には、次の繰り返しへ移行する前に、$countをインクリメント(1を足しこむ)処理を行なっています。
『繰り返し処理』の部分では、メッセージを出力する際の数字の部分に$countの値を使用しています。
処理を順に説明しますと、まず初期化が行なわれ、ブロック内へ制御が移り、メッセージが出力されます。
この時、$countは初期化した後なので、0が入っているはずです。
処理がブロックの終端まで行くと、『条件』を確認します。
$countは0なので、『100以下なら』という条件に合致している為、『実行』に移ります。
『実行』では、$countがインクリメントされます。そして、再度ブロック内へ制御が移ります。
そしてメッセージが出力されますが、この時の$countは『実行』によってインクリメントされた後ですので、
$countには1が入っています。なので、『1回目のメッセージです』と出力されます。
そして、ブロックの終端へ行けば再度『条件』を確認し、『実行』にてインクリメントされ
ブロック内を処理します。
これを、『条件』に合致する限り繰り返しますので、最終的には$countが101までインクリメントされると
繰り返し処理を終了し、次の処理へ移行します。
これで大分見通しの良いプログラムとなりました。
前述した『偶数と奇数でメッセージを変えましょう』とか『10ずつのメッセージにしましょう』の様な仕様変更があったとしても、
条件分岐の制御構文と組み合わせれば簡単に対応出来てしまいます。
for( $count=0; $count<=100; $count++ ){ if( ( $count % 10 ) == 0 ){ echo $count."は10の倍数です。"; } if( ( $count % 2 ) == 0 ){ echo $count."は偶数です。"; } else{ echo $count."は奇数です。"; } }
条件だけを指定する繰り返し制御構文
『for()』以外にも、繰り返しを行なう制御構文が存在します。
それが、『while()』です。
『while()』は、『for()』の『条件』の部分だけ指定するイメージです
while( 条件 ){ 繰り返し処理 }
『while()』では、『for()』の様に『初期化』や『実行』が無い分、
実行前やブロック内で『初期化』や『実行』の部分を記述する必要があります。
では、『for()』の時に示した例文と同じ処理を『while()』で再現してみましょう。
$count = 0; while( $count <= 100 ){ echo $count."回目のメッセージです"; $count++; }
変数名等も揃えたので、大分イメージが湧きやすいと思います。
『for()』を使うか、『while()』を使うかは好みやコーディングスタイルによって違いますので、
お好きな方を使用して下さい。
配列を順に処理する繰り返し制御構文
配列には複数の値が格納されているかと思いますが、
その配列内の要素を順に取得しながら繰り返し処理を行ないます。
ですので、繰り返し回数は配列の要素数となります。
では早速、実装方法を見てみましょう。使用する関数は『foreach()』です。
foreach( 配列 as 添え字を格納する変数 => 値を格納する変数 ){ 繰り返し処理 }
『配列』の部分には、順に値を取り出したい元の配列を指定します。
『添え字を格納する変数』は、配列から取り出された値の添え字が格納されます。
『値を格納する変数』は、配列から取り出された値が格納されます。
配列から順に値を取得しながら、繰り返し処理内で値を使用出来るように
それぞれ変数に代入されているイメージですね。
では実際のプログラムを見てましょう。
$arr = array( "aaa" => "AAA", "bbb" => "BBB", "ccc" => "CCC" ); foreach( $arr as $key => $val ){ echo "大文字の添え字は".$key; echo "小文字の値は".$val; }
今回は連想配列を例に出しましたが、通常の配列の場合ですと、
$keyにはインデックス番号が代入されます。
この『foreach()』はPHPの世界ではとても良く使用しますので、
しっかりと覚えておきましょう。
また、連想配列ではなく、通常の配列を順に処理するのでしたら
『for()』や『while()』でも代用する事が出来ます。
それは、インクリメントされる値をインデックス番号として指定する方法です。
その際には、配列の要素数を予め取得しておかないと、
繰り返す条件を決められないので注意が必要です。
配列の要素数を取得するには関数『count()』を使用しましょう。
$arr = array( "AAA", "BBB", "CCC" ); $array_count = count( $arr ); for( $count=0; $count<=$array_count; $count++ ){ echo $arr[$count]; }
配列の要素数に達するまでを条件とし、インクリメントしながら
インデックス番号を配列に指定して値を取得しています。
どの関数を使用して、どの様に処理を行なうかはプログラマのセンスにかかっています。
同じ処理結果になったとしても、プログラマによって描く処理ロジックは様々です。
後は処理効率とか、アルゴリズム的なお話になってきますので、
まずは自分のスタイルを見つけて、目的を達成する手段を見に付けてください。
繰り返し処理をサポートする便利関数
ある程度プログラムを組める様になってくると、
繰り返し処理に置いて、例えば指定した条件以外でも繰り返し処理を終了したい時や、
処理を飛ばして次に繰り返し処理へ制御を移行したいなど、希望が出てくるかと思います。
そんな要望を叶えてくれる関数がPHPには標準で用意されています。
まず、前者の『繰り返し処理を終了』する関数として用意されているのが『break』です。
『break;』と記述した所へ処理が到達すると、即座に繰り返し処理を終了して
ブロックから制御が外れます。
下記の例ですと、$countが100を超えなくても、50になったら処理を終了しています。
$count = 0; while( $count <= 100 ){ if( $count == 50 ){ break; } $count++; }
そして、後者の処理を飛ばして次に進めたい時は『continue』を使用します。
下記の例だと、10の倍数の時は出力しないで次へ処理を進めます。
for( $count=0; $count<=100; $count++ ){ if( ( $count % 10 ) == 0 ){ continue; } echo $count."回目のメッセージです"; }
繰り返し処理内で複雑な処理を行なったり、条件を細かく指定しなければいけない時等に
活躍します。
繰り返し制御構文を使用する際には、とても力強い味方となりますので、
このサポート関数も是非とも身に付けましょう。