PHP講座入門

制御構造 分岐

 さて、だんだんとプログラムらしくなってきます。3-3 実際に動かす で利用した、testフォルダーに test.php というファイルを作り、ブラウザから http://127.0.0.1/test.php と入力してテスト結果を確認しながら進むと分かりやすいと思います。のボタンをクリックしてソースを出し、全選択してエディターに貼り付けるとやりやすいと思いますよ。

 

 では早速講座に入ります。今回は制御構造というものです。

 プログラムはそのまま書くと、上から下へと命令を実行していきます。途中である条件の時だけ実行したい、という状況が出てくるはずです。それが分岐です。

 

if

 もしという語を英語に訳すと、if になりますね。その言葉の通り、もし条件に合っていたら実行するという動作が可能になります。

 実際例を見てみたほうが分かりやすいかもしれません。

<?php
$a = 5;
if ($a < 10) echo '$aは10より小さいです。
'; if ($a >= 10) echo '$aは10以上です。
';
 出力結果は
$aは10より小さいです。
 となります。

 文法は、if (条件) 条件がTRUEの時に実行する文; となります。丸括弧の前後にスペースを入れても差し支えありません

 同一条件で複数の命令を実行するときはどうするのでしょうか? まあ次のように書けないこともありません。

<?php
$a = 5;
if ($a < 10) echo '$aは10より小さいです。
'; if ($a < 10) echo 'やっぱり10より小さいです
'; if ($a < 10) echo 'それでも10より小さいです
'; if ($a >= 10) echo '$aは10以上です。
';
 でもちょっと非効率ですね。

 そこでブロックというものがあります。{ }(波括弧)で囲った範囲が一つの複合の文とみなされて実行されます。上記を書き換えてみましょう。

<?php
$a = 5;
if ($a < 10) {
	echo '$aは10より小さいです。
'; echo 'やっぱり10より小さいです
'; echo 'それでも10より小さいです
'; } if ($a >= 10) echo '$aは10以上です。
';
 こうなります。見やすいですし、if が2回だけになる分早く処理が終わります。

 また ifは無限に入れ子(ネスト)にすることができます。

<?php
$a = 5;
if ($a < 10) {
	echo '$aは10より小さいです。
'; if ($a < 9) { echo '$aは9より小さいです。
'; if ($a < 8) { echo '$aは8より小さいです。
'; if ($a < 7) { echo '$aは7より小さいです。
'; if ($a < 6) { echo '$aは6より小さいです。
'; if ($a < 5) { echo '$aは5より小さいです。
'; } } } } } }
 こんな風にも書けますが、ここまでネストが深くなるようなら、プログラム的には他の手段を考えた方が良いと思いますね。

 そして、これは見やすさの話になるのですが、例えif文で実行するものが1文だったとしても、波括弧で囲った方が良いと思います。後でバグを生みにくくなります。

else

 ifとセットになるのが、else です。日本語にすると「ほかに」になるでしょうか。

 ここでも実例を見ましょう。

<?php
$a = 5;

if ($a < 5) {
	echo '$aは5より小さいです。
'; } else { echo '$aは5以上です。
'; }
 出力結果は
$aは5以上です。
 となります。

 elseif とセットでしか利用できません

 文法は、

  if (条件) 条件がTRUEの時に実行する文;
  else 条件がFALSEの時に実行する文;

 となります。

 文のところにブロックを入れることができますので、上記のようなコードになるわけです。

 

elseif または else if

 何んとなーく察しは付くような気がしますが、elseだった時にifを連続して記述することができます

 こちらも実例を見てみましょう。

<?php
$a = 8;

if ($a == 10) {
	echo '$aは10です。
'; } else if ($a == 9) { echo '$aは9です。
'; } else if ($a == 8) { echo '$aは8です。
'; } else { echo '$aは10,9,8以外です。
'; }
 出力結果は
$aは8です。
 となります。

 最初のif文で10ではないので、elseの方に行きますが、すぐに次のif文が実行されます。9ではないので、elseの方に行きますが、すぐに次のif文が実行されます。8なのでifのすぐ後のブロックが実行される、という訳です

 ちなみにこれは、以下のコードと等価です。

<?php
$a = 8;

if ($a == 10) {
	echo '$aは10です。
'; } else { if ($a == 9) { echo '$aは9です。
'; } else { if ($a == 8) { echo '$aは8です。
'; } else { echo '$aは10,9,8以外です。
'; } } }
 このようにelseの中のブロックにifを持ってくれば、まったく同じ動作になりますが、ネスト(入れ子)が深くなってしまうので、読みにくく(可読性が落ちるといいます)なります。

switch case

 まず、このコードを見てみてください。

<?php
$a = 2;

if ($a == 1) {
	echo '$a は 1です。
'; } else if ($a == 2) { echo '$a は 2です。
'; } else if ($a == 3) { echo '$a は 3です。
'; } else if ($a == 4) { echo '$a は 4です。
'; } else if ($a == 5) { echo '$a は 5です。
'; } else { echo '$a は 1~5以外です。
'; }
 それぞれ$aがどんな数字なのかで処理が分岐されます。

 これを別の書き方ができるのが、switch case文です。では実際に書き換えてみましょう。

<?php
$a = 2;

switch($a) {
	case 1:
		echo '$a は 1です。
'; break; case 2: echo '$a は 2です。
'; break; case 3: echo '$a は 3です。
'; break; case 4: echo '$a は 4です。
'; break; case 5: echo '$a は 5です。
'; break; default: echo '$a は 1~5以外です。
'; }
 この文の特徴は、switchif のように丸括弧を伴っていますが、ここに条件を書くのではなく、評価対象になる式が来ます。いわゆるの==(比較演算子「等しい」)の左辺です。

 そして波括弧の中に実際に評価する対象を書きますが、それがcase文です。

 case 評価式: という文法になります。この評価式が==の右辺になります。

 このswitch文の面白いところは、上記の例ですと、$a は 2なので、まず、case 2: のところまで処理を飛ばします。そしてそこから順に下に向かって実行していきます。

 break文はswitchやfor、whileなど(これらは後述します)の処理をそこで中断し、波括弧の次の行に処理を移します。それで$a が 2の時の処理を行なっただけで、このプログラムを抜けることになります。

 ではbreakが無かったらどうなるのでしょうか。実際に実例を見てみましょう。

<?php
$a = 2;

switch($a) {
	case 1:
		echo '$a は 1です。
'; case 2: echo '$a は 2です。
'; case 3: echo '$a は 3です。
'; case 4: echo '$a は 4です。
'; case 5: echo '$a は 5です。
'; default: echo '$a は 1~5以外です。
'; }
 出力結果は
$a は 2です。
$a は 3です。
$a は 4です。
$a は 5です。
$a は 1~5以外です。
 となって、case 2: 以降の文が全部実行されているのが分かると思います。

 このように、switch は、必ず caseとbreak とセットで利用すると覚えてください。

 

 次に別の制御構造 繰り返しについて学んでいきましょう!

目次

×