タイトルに、制御構文って難しそうじゃね?と書いたものの、
何をもって難しそうなのかも解らないかもしれませんね。
制御構文は、プログラムの流れを制御するための文法のことで、
日本語で表現するならば
『もし、~ならば~する。』や、『~回、~する。』といった感じで
条件や回数なんかを指定して「~する」といった命令コントロールするために使われます。
ひとつの目的を達成するのに、いろんな書き方の制御構文があるのですが、
今回、私が解説するのは、if文、switch-case文、for文、foreach文の4種類だけです。
大概の事は、この文だけで出来ると思います。
他にも、while文や、do-while文などがあるんですが、省略しますので、
興味がある方は、検索エンジンで「PHP 制御構文」と検索してみるといいでしょう。
今回は、長くなるので気合いを入れずに読んでください。
1.if文
if文は、既に先の記事にも出てきてますが、お復習いしてみます。
$tenki = "hare";
if($tenki == "hare"){
echo "今日の天気は晴れです。";
} else {
echo "天気はまだ解りません。";
}
?>
上記のプログラムは、
変数「天気」に「晴れ」という文字が入れられています。
もし、その変数天気の中身が「晴れ」であれば、「今日の天気は晴れです。」と表示され
違えば「天気はまだ解りません。」と表示されるソースコードです。
何となくでもいいので、理解していきましょう。
では、晴れの時は「今日の天気は晴れです」と表示させ、
曇りの時は「今日の天気は曇りです。」と表示させ、
雨の時は「今日の天気は雨です」と表示させ、
晴れでも曇りでも雨でも無いときは「天気はまだ解りません」と表示するように作り替えてみましょう。
$tenki = "hare";
if( $tenki == "hare" ){
echo "今日の天気は晴れです。";
} elseif( $tenki == "kumori" ) {
echo "今日の天気は曇りです。";
} elseif( $tenki == "ame" ){
echo "今日の天気は雨です。";
} else {
echo "天気はまだ解りません。";
}
?>
「elseif」が出てきました。
これは、「もし、Aならば~する。AじゃなくてBならば~する。」といった場合に使う文で、
AじゃくてBならば が、elseif( 条件 )と対応しています
なので、いきなりelseifから始まるif文は存在しません。if ~ elseif ~ else~ と絶対になります。
しかし、天気の種類は、「晴れ、雨、曇り」だけではありませんし、もっと多い条件分けが必要な場合も多々あります。
そんなときに使うのが、switch-case文です。
2.switch文
switch文は、if文の条件が比較的単純で、多くの条件分けが必要な時に向いている制御構文です。
まずは、次のソースを見てください。
$tenki = "hare";
switch($tenki){
case "hare":
echo "今日の天気は晴れです。";
break;
case "kumori":
echo "今日の天気は曇りです。";
break;
case "ame":
echo "今日の天気は雨です。";
break;
default:
echo "天気はまだ解りません。";
break;
}
?>
switchの後ろの()の中に、判定したい変数を入れるのが一般的な使い方です。
上記のソースの場合は、$tenkiの中身を判定の材料にして処理を分けます。
次に、case を見て下さい。caseは、日本語で言うと「場合」です。
つまり、”hare”の場合 は、その下の全て処理を行います。
この「全て」が曲者です。case は、次にcaseが出てきても無視して処理を実行します。
つまり、$tenki に 「hare」が入っていた場合は、
「今日の天気は晴れです。今日の天気は曇りです。今日の天気は雨です。天気はまだ解りません。」と全部表示してしまうのです。
それを防ぐために、「break;」が入っています。
このbreakを見つけると、caseは、その処理から抜け出します。
そして、defalutが出てきますが、これは、指定されているどの場合にも当てはまらない場合に実行されます。
私が使う場合の使い方は、デフォルト(規定値)の設定の場合と、どの場合にも当てはまらない場合の二つです。
上記のソースでは、どの場合にも当てはまらない場合として使っています。
規定値として使う場合は、以下のソースの用に使います。
$tenki = "Fubuki";
switch($tenki){
default:
case "hare":
echo "今日の天気は晴れです。";
break;
case "kumori":
echo "今日の天気は曇りです。";
break;
case "ame":
echo "今日の天気は雨です。";
break;
}
?>
上記のソースを実行してみましたか?
「今日の天気は晴れです」と表示されたのではないでしょうか。
$tenkiの中には「Fubuki」と入っているので、どのcaseにも当てはまりません。
なので、defaultに割り振られて処理がされますが、breakが見つかるまで処理されるので、
8行目の「今日の天気は晴れです」と表示する命令までは実行することになります。
つまり、$tenkiには、「hare , kumori , ame」以外のものが入っていた場合は、
「hare」が入っていた場合と同じ処理をするようになります。
つまりはdefault(規定値)が「hare」であるのと同じになります。
このような処理をする場合は、いろんな場合がありますが、条件が絞れない場合や決まった処理がある場合に
よく使われます。簡易的なエラー処理にも使えますので、覚えておくと良いかもしれません。
最後に、switch文を日本語で書くと、こんな感じになります。
理解を深める参考までに!
($tenki)で条件分岐
「hare」の場合は:
晴れと表示する。
この処理から抜ける。
「kumori」の場合は:
曇りと表示する。
この処理から抜ける。
3.for文
やっと長いswitch文が終わったのですが、for文も厄介です。
for文は、処理を繰り返す(ループ)ために使われます。
基本的な使い方は次のようになります。
for( $i=0; $i < 10; $i++){
echo $i."
";
}
?>
もちろん2行目が重要ですね。
$が付いているので$iが変数だと解ると思います。
どこから$iが出てきたのか・・・・。謎です(--:
ぶっちゃけ、$iじゃなくても$a でも $b でも $count でも何でも良いんです。
$iとするのはプログラムの風習的な物や、簡単な方がコーディングに時間が掛からないのが理由だと思います。
ここでは、解りやすいように$count にして説明します。自分でプログラムを、趣味でやる程度であれば
$iを覚えておく必要はありませんが、誰かとプログラムを共同開発する場合や、仕事で一般的なコーディングを
必要とする場合は、$iで作るようにしましょう。
それでは、解説を再開しましょう。
for文の基本は次のようになります。
for( $count=0; $count < 10; $count++){
echo $count."
";
}
?>
for ( 初期化 ; 条件 ; 処理後の処理 )
ちょっと、解りにくいですよね・・・(反省してますが、旨い表現が思いつきません。。。
なので、ちょっと丁寧に説明します。
初期化では、
$count = 0になっています。
これは単純に、for文を実行するために$count変数の中身を0にしたことを表します。
何かをするまえに変数の中身を空にしたり、必要な値にセットし直すことを初期化といいます。
for文以外でも初期化という言葉が出てくると思いますので頭の片隅に入れて置いてください。
条件では
$count<10となっていますので、この条件を満たしている間は、
{}で囲まれている処理を実行することです。
処理後の処理とは・・・。
一番解りづらい表現ですが、上記の条件が満たされている場合は、for文は{}内の処理を行います。
この処理が行われた後、この「処理後の処理」が実行されるのです。つまり、ここにはfor文が一回実行される度に
呼び出される処理が書いてあるということです。
ここに書かれている$count++というのは、$count = $count + 1;の省略式です。
プログラムでは、同じような処理や決まった処理に省略形があったりします。
この$count++も省略系で、$countにプラス1するという意味があります。
流れは何となくつかめましたか?
では、全体を追ってもう一度説明します。$countに重点を置いて説明しますので、追って見てください。

for文 が実行される時は、まず初期化の処理がされます。$count = 0
そして、条件が満たされているかが判定されます。 $count < 10
この場合、初めてfor文が実行される場合には、$countには0が入っているので、
「10より小さい」という条件が成り立つので、
{}の中身が実行されます。この場合は、echo $count.”<br />”;です。
つまりは$countの中身を表示する命令です。 が・・・ 今までにはない."<br />"が付いてますね。
htmlを少しやったことがある人は、解ると思いますが<br />は、改行をするためのHTMLタグです。
そして、最初に付いてる「.(ドット)」は、二つの物を連結するための記号です。
$countと<br />をくっつけるための記号です。
さて、見てみるのが一番です。
上記のプログラムを実行してみましょう。
0
1
2 (以下略)
と改行されて表示されてますよね。表示されたもののHTMLのソースを見るとなっています。
表示は改行されているのに、HTMLソースは改行されていないのにも理由があるんですが、それはまた今度にします。
0
1
2
3
4
5
6
7
8
9
さて、for文について、少しはわかりましたか?
このfor文については、重要ですので、問題を出してみます。
この問題を解いてみてください。
答えは、特設ページに置いておきます。
◆基礎問題(1)◆
for文を使って、1から100まで表示するプログラムを作りなさい。
(これは簡単!ちょっと改造すれば良いんだよ。注意点はひとつ、1から始まるって事!)
答え合わせはこちら
◆応用問題(1)◆
for文を使って、1から100までの奇数を表示するプログラムを作りなさい。
(今までに解説した内容だけで作れる方法で作ってみてね!)
答え合わせはこちら
問題の内容で、間違いや解らないことがあったらお問い合わせください!

4.foreach文
for文は、少しだけでも理解できましたか?次の制御構文は、foreach文です。最初にforと付いているので
また繰り返しをする制御文だというのは想像できると思います。
残念ながら、このforeach文を理解するには、配列という物を理解しなければなりません。
配列というのは、複数次元のデータ集合体です。はい、わざと難しく言いました。スイマセン。
配列とは右の表のような物だとイメージしてください。
まずは、配列で、AとBとCを表現してみます。
$array[1][1] = "A";
$array[8][3] = "B";
$array[4][10] = "C";
?>
どうですか?$arrayという変数は、この際無視して[][]二つの括弧に注目してください。
一つ目の括弧の中身が上部の数字を、二つ目の括弧の中身が左側の数字を表しているのが解ると思います。
そこで、少し右側の表のイメージをもっと柔軟にイメージしてみてください。
配列というのは、次のような物もあります。
$array[0] = "変数の中身";
$array["Xzahyo"]["Yzahyo"] = "変数の中身";
$array[4][10][8] = "変数の中身";
?>
3行目のは「一次元配列」 4行目のは「連想配列」 5行目のは「三次元配列」 と表現されることもあるんですが
正直、名前なんてどうでも良いです。いろんな配列があり得るという事と、いろんな配列を頭の中で
表のようにイメージできるようになる方のことが重要です。
さて、配列について少しだけ理解して貰いました。
ここからが本題です。
この配列の中に入っているデータを、貴方は取り出したいと思っているとします。
決まった数字でデータが整然と入っている配列であれば、for文で取り出すことが出来ます。
って簡単にできます。と言われても困りますね。
ということで、次のソースコードを入れてみてください。
$array = array("a","b","c","d","e","f","g","h","i","j");
for($i=0; $i < 10; $i++){
echo "array[".$i."] :: ".$array[$i]."
";
}
?>
ちょっとずつ複雑になってきましたが、大丈夫。
今までの事を理解してきていれば、何となくでも解るはずです。
順に説明していきます。
3行目は、$arrayという変数に、何かを入れているのは解ると思います。
そう、a~jを順番に入れているんです。
$array[0] = "a"; $array[1] = "b"; ・・・ なんて、面倒な入力をしなくて済むようになっています。
つまりは、[0]~[9]に、a~jの文字が入っている状態です。
そこで、for文です。
$iを初期化で0にセットして、$i が10より小さいときに{}内の処理をします。処理後は$iにプラス1をする。
つまり一番最初の処理では、
$iが0で、中の処理を実行されて、「array[0]:: a」と表示されるのは解りますか?
その後、$iは1になり中の処理が実行され・・・「array[1]:: b」と表示される・・・。
$iの値が一つずつ増えていくことによって、呼び出される配列の中身も変わっていくということです。
では、最初の配列の種類を説明した連想配列の場合や、不規則に配列にデータが入っている場合はどうでしょう。
かなり面倒なことになりそうな予感がしませんか?
そう、ここでやっと、foreachの出番です。
では、foreach文のソースコードを見てみてください。
$array[1] = "A";
$array[8] = "B";
$array[4] = "C";
$array["Xzahyo"] = "D";
$array[10] = "E";
foreach($array as $key => $value){
echo "key = ". $key . " :: value = " . $value . "
";
}
?>
$arrayは一次元配列で、データはバラバラで、一部は連想配列になっている。
この状況では単純にfor文を使ってデータを取り出せません。
(一応書いておきますが、for文でもデータを取り出す方法はあります。)
しかし、foreach文を使うと簡単に取り出すことができます。
では、説明してみます。
$arrayにデータを入れているのは、既に解るかと思います。なのでforeach文の所を重点的にいきます。
foreach ( ループする配列 as キー => 変数の中身) となります。
ループする配列というのは、データを取り出したい配列ということになります。
キーというのは、[]の中の文字や数字のことで、添え字とかインデックスとかキーとか呼ばれます。
変数の中身は、まさに変数の中身です。取り出したいデータということになりますね(^^;
上のソースを実行するとイメージしやすいかと思います。
このforeachを使えば、配列の中に何個データが入っていても取り出せるということになりますね。
では、ここで問題にいきましょう!
◆基礎問題(2)◆
foreach文を使って、次の配列の全データを表示しなさい。
$array = array(
"apple",
"banana",
"peach",
"pineapple",
"strawberry",
"orange"
);
?>
答え合わせはこちら
◆応用問題(2)◆
foreach文を使って、次の配列のキーの色をしたデータを出力しなさい。
色の指定は、<span style="color: ** ;">****</span>で行うものとする。
(HTMLとCSSを利用して色を指定する必要があります。ちょっと難しいかもしれませんが是非チャレンジを!)
$array = array(
"red" => "apple",
"yellow" => "banana",
"pink" => "peach",
"green" =>"pineapple",
"bule" => "strawberry",
"orange" => "orange"
);
?>
答え合わせはこちら
制御構文は如何でしたか?
やっと、制御構文って難しそうだな・・・と思って頂けるようにはなったでしょうか?
そう思えるようになったなら、一歩前進ですね!
この「プログラムの基礎」で書く内容が色んな物へ通じていますので、
挫けずに、読んだり試したりしながらのんびり何度も読んで、改造してみてください。
さて、今回のところは疲れたんじゃないでしょうか?
書く方が疲れました(^^;
ということで、次は、関数についてです。