基本となる制御文(if、for、foreach、while、switch)
プログラムはもともとファイル内の上から順に下側に向かって実行されていきます。しかし、制御文を使えば、演算結果によって処理を変えたり停止したりすることが可能になり、また一定範囲の同じプログラムを繰り返しさばいたりたりすることもできるようになります。ピーエイチピーでは、「if」「for」「foreach」「while」「switch」が代表例で、他に「break」や「continue」といった、繰り返してさばく途中で停止したり飛ばしたりする制御文もあります。
if(イフ、エルスイフ、エルス)
ifは、「もし~であれば~する」という意味です。条件に一致、或いは一致しなかったケースの二つを処理をします。if単独で使うこともできますが、これに「elseif」や「else」を加えてより詳細に条件を指定することもできます。後者を使う場合、条件の数だけ{}でくくってブロックを作り、その中に処理するためのプログラムを記入していきます。ブロックの中には更にifを入れ子にすることができ、これを「ネスト」と言います。尚、「elseif」は「if」の次から記入するもので、「if{~}elseif{~}elseif{~}・・・」という形で使います。また、「else」は「if」以外のことで、「if」と「elseif」に該当しないケースの処理を「else」のブロックに記入します。書式は、「if{~}else{~}」、もしくは「if{~}elseif{~}else{~}」といった形になります。
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
$a="2"; |
if($a == 1){ |
print '$aは1です。'; |
} |
elseif($a == 2){ |
print '$aは2です。'; |
} |
elseif($a == 3){ |
print '$aは3です。'; |
} |
else{ |
print 'いずれにも一致しません。'; |
} |
for(フォー)
forは、繰り返してさばきます。書式は「for($i = 0;$i <= 10; $i++){~}」で、通常カウンタを設置します。この例では、左側からまず$iを0とし、$iが10以下まで実行する指示、そして$i++で1ずつ足すというカウンタの増え方を指定しています。こちらもforの中にforを入れることができ、このケースを二重ループと言います。
1 |
2 |
3 |
for($i=0;$i < 2;$i++){ |
echo 'おはよう。'; |
} |
foreach(フォーイーチ)
foreachは、配列の数だけさばく文で、繰り返しの回数を前もって定めているforとこの点で異なります。書式は「foreach($a as $value){~}」もしくは「foreach($a as $key => $value){~}」となります。前者は配列の要素($value)だけを取り出す文で、後者は要素($value)と共に添字($key)も取り出せます。また、後者は連想配列をさばく際にも使われます。この場合、連想配列の添字に好きな名前を入れることができ、数値以外の添字も扱えるようになります。尚、いずれも「$a」には配列を入れなければなりません。
1 |
2 |
3 |
4 |
$a=array("りんご" => "赤色","ピーマン" => "緑色","レモン" => "黄色"); |
foreach($a as $key => $value){ |
print $key.":".$value."。"; |
} |
while(ホワイル)
whileはforとは異なり、条件が成立しているものの繰り返す回数が分からない時に利用されます。構文は「while($a < 10){~}」などで、この場合は$aが10以内から抜け出すまで繰り返すという意味になります。しかし、言い方を変えれば抜けるまで永遠に繰り返すという意味になりますので、無限ループに注意が必要です。また、$aが10や11などであれば一回も実行されません。これに対しdo~whileは、条件を最低一回以上繰り返す文です。通常のwhileは最初のループで条件が一致しなければ一回も実行されませんが、do~whileでは最低限、一度は実行されます。構文は「$i = 5;do{$i++;}while($i < 9);」などで、この場合の結果は「9」になります。
1 |
2 |
3 |
4 |
5 |
$i = 5; |
while ($i < 10){ |
print '$iは'.$i.'です。'; |
$i += 1; |
} |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
$a = 0; |
$i = 0; |
do{ |
++$i; |
$a += $i; |
}while($i < 5); |
print "1ずつ足しながら $i まで足すと $a になります。"; |
switch(スイッチ)
switchは「case:」を複数用いて、条件に一致する最初の「case:」で「break」させて終了させて使います。どれにも一致しなかったときは、最後の「default:」に進み、そこで終了します。ポイントは「break」で、これを記述しなかった場合、全てさばいてしまいます。各「case:」の最後尾には「break」を記入し、選択した処理のみをさせるようにします。書式は「switch(式){case値a:値aのときの処理;break;default:どのcaseにも一致しなかったときの処理;}」となります。
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
$a="い"; |
switch($a){ |
case 'あ':echo '[ a ]です。';break; |
case 'い':echo '[ i ]です。';break; |
case 'う':echo '[ u ]です。';break; |
// defaultは無くても動作します。 |
default:echo '[ e ]です。'; |
} |
尚、一般にはifの処理をswitchで実現できるとき、switchのほうがが速いと言われています。ただ、ピーエイチピーのバージョンが上がるにつれて、スピードも含めて色々改善されていきますので、それほど神経質になる必要もないと思います。また、未来の予測は難しいため、まずは理解や管理のしやすさなどの観点から取り組み、時間の経過と共に問題が発生した時点で改善を試みるというやり方が良いのかも知れません。
以下の文は、ループの中で使われます。
break(ブレイク)
breakを使うと、break;が記入された部分を基準とし、そこから最も近いブロックの終了へ飛び越えます。つまり、ループが中断するということになります。また、ブロックとは、「{」と「}」に囲まれた部分です。
continue(コンティニュー)
continueは、breakに対するもので、ループの全てを中断するのではなく、その回のループのみを中断し、次の回からはまた実行するという意味になります。
その他
シングルとダブルクォート
echoなどで出力する際に「"」で括ると、内部にそのまま記入した$aなどの変数は展開されて表示されます。例えば「echo "$a こんにちは $b";」といった感じで記入します。これに対し「'」で括ったケースでは、展開されません。前者をダブルクォート、後者をシングルクォートと言いますが、シングルクォートを使って変数を展開させるには、変数の前後に「.」(ドット)をつけて、「echo 'こんにちは'.$a.'~です。';」という風に記入します。
以上が制御文の基本的な仕組みです。