PHP基本編

条件分岐

1. if文による条件分岐

 PHPに限らずプログラムにとって極めて重要な条件分岐について確認しましょう。「AだったらBをする、CだったらDをする、そうじゃなければEをする」といった処理です。これには「if文」を使います。英語で「もし~なら・・・」というやつです。また続けて「else if」を使い「そうじゃなくて、もし~なら・・・」を指示したり、さらに「else」を使って「どれも違うなら・・・」を指示します。if(条件)だけのシンプルなタイプから順に見ていきましょう。

  

 意味としては「if(条件)を満たせば、続く{ }内に設定された命令を実行し、満たさなければ何もしない」ということになります。一番簡単なパターンです。
 続いて「条件を満たさない場合」に何をするかを指定する「else」を使った条件分岐について見てみましょう。

  

 こちらは上の単純な「if(条件)~」に「else~」をくっつけたものです。「if(条件)を満たせば、続く{ }内に設定された命令を実行し、満たさなければelseに続く{ }内に設定された命令を実行する」という意味になります。
 さらに、if(条件)を満たさない場合に、別の条件を満たすなら~を実行し、それも満たさない場合にまた別の条件を満たせば~を実行し・・という場合には「else if(条件)」を使います。

  

 一つ上のif文の「if」と「else」の間に「else if(条件)」があることを確かめて下さい。その上で意味を確認すると「もし条件1が満たされれば続く{ }内の命令を実行し、そうじゃなくてもし条件2が満たされれば続く{ }内の命令を実行し・・・・いずれの条件も満たさなければelseに続く{ }内の命令を実行する」ということになります。途中「・・・・」の部分は、「else if(条件)」を「条件3、条件4・・」と追加できることを示しています。つまり、「もし~ならA処理、違ってもし~ならB処理、それとも違ってもし~ならC処理、いずれも違ったらD処理」という形で、複数の条件が連なるような状況に使えるわけです。
 「else if(条件)」については、たまに「if else(条件)」と書く人がいるので注意です。「else if(条件)」は、まさに「else」と「if(条件)」がくっついたような意味合いで、その前の条件を受けて「そうじゃない場合で(else)、もし(if)~なら~する」といった条件分岐を指定するものです。なので「else if(条件)」であって「if else(条件)」ではありません。

2. 具体例を見て確認

 if文による条件分岐の基本構造が分かったところで、少し具体的な例で確認しましょう。以下のサンプルは作る必要はありませんので、まずはじっくり見て下さい。これもシンプルな方から検討していきます。

  

 まず1行目はOK。2行目も大丈夫ですよね。「$omajinai='ひらけコマ';」ということで、「ひらけコマ」という文字列を変数「$omajinai」に代入している、ということです。
 問題はその次の「if文」。「if($omajinai=='ひらけごま')」は、「もし$omajinaiが、'ひらけごま'と同じなら」という意味になります。「==」はイコールが2つです。決して誤入力ではありません。忘れがちですが2つ必要です。これは「左辺と右辺が一致すれば」という条件を表しています。
 そして次の行からの{ }の中。if文の条件が満たされたときに実行する内容が書かれています。このサンプルでは「echo 'あたりです!';」つまり「あたりです!と表示せよ」ということです。
 実行するとどうなると思いますか?正解は「何も処理されない」です。変数$omajinaiには「ひらけコマ」が入っていますので「変数$omajinaiの内容が'ひらけごま'に等しい」というif(条件)は満たされません。そして満たされないときに何をするかの指示もありませんので、何も処理されずに終わることになります。
 そこで「else」を使って「条件が満たされないときに何をするか」を指定します。次の例を見ましょう。

  

 先の例から追加されたのは「else」と続く「{ }」です。これは前のif文の「もし~なら」という条件を受けて「そうじゃないなら」「条件が満たされないなら」その後に続く{ }に指定された処理を実行しなさい、というものです。
 これを実行した結果はわかりますよね?変数$omajinaiの内容は「ひらけコマ」ですのでif(条件)は満たされず、elseに続く{ }内に指定された「echo 'はずれです!';」が処理され「はずれです!」と表示される、というわけです。ですがもし2行目のところを「$omajinai='ひらけごま';」と修正したら?「変数$omajinaiの内容が'ひらけごま'に等しい」というif(条件)が満たされますので「あたりです!」と表示されます。
 この例の条件分岐は「条件を満たすか、満たさないか」だけでしたが、実際には「条件を満たせばA、満たさなくて別の条件を満たせばB、それも満たさないけど別の条件を満たせばC、どれも満たさないならD」といった状況が出てきます。そこで登場するのが「else if」です。

  

 追加されたのは7行目から14行目まで。先ほどの例の「if」と「else」の間に2つの「else if(条件)」が追加されています。よく見て構造を理解して下さい。
 まず1つ目の「else if」。条件に「$omajinai=='ひらけゴルァ'」と指定されています。「==」の意味は上で確認した通り「左辺と右辺が等しいかどうか」という条件を表します。ですのでこの「else if(条件)」の意味は、「その前の条件が満たされない場合、もし$omajinaiの内容が'ひらけゴルァ'なら続く{ }内の処理を実行しなさい」ということになります。{ }内にはecho命令で「落ち着いて」と表示するよう設定されています。
 次に2つ目の「else if」。条件は「$omajinai=='ひらけコマ'」となっています。ですのでここの意味も「その前の条件が満たされない場合、もし$omajinaiの内容が'ひらけコマ'なら続く{ }内の処理を実行しなさい」となります。{ }内には「おしいです」と表示するecho命令が設定されています。
 そして最後の「else」と続く{ }内の処理は、先にみた例と同じ。「その前の条件が満たされない場合、'はずれです'と表示しなさい」という内容です。
 プログラム全体の流れをまとめると次のような処理になります。
  1. 変数$omajinaiに「ひらけコマ」を代入。
  2. $omajinaiの内容は「ひらけごま」と等しいか?
  3. 等しければ「あたりです!」を表示する。
  4. そうでない場合、$omajinaiの内容は「ひらけゴルァ」に等しいか?
  5. 等しければ「落ち着いて」を表示する。
  6. そうでない場合、$omajinaiの内容は「ひらけコマ」に等しいか?
  7. 等しければ「おしいです」を表示する。
  8. そうでなければ「はずれです!」を表示する。
 ではこのプログラムを実行するとどうなるか考えてみて下さい。変数$omajinaiの内容は「ひらけコマ」ですので、最初の「if(条件)」の「ひらけごま」とは違う、ということで次へ。次の「else if(条件)」も「ひらけゴルァ」なので条件を満たさず次へ。2つ目の「else if(条件)」は・・・「$omajinai=='ひらけコマ'」が成立します。ということで続く{ }内が処理され「おしいです」と表示されます。結果、その後の処理は実行する必要がなくなり、この「if文全体」が終了となります。
 わかってきましたか?「if文」の条件分岐の基本パターンはこれだけですので、「if(条件)」「else if(条件)」「else」とそれぞれの「{ }」がどのように配置されているかよく理解しておいて下さい。
 それから全体を通してもう一点。書き方の工夫を確認しましょう。「if文」は、書こうと思えば改行を入れずに「if(条件){条件OKの処理}else{条件NGの処理}」のように一行で書くこともできます。ですがそれでは当然「見にくい」。見にくいとプログラムでミスしやすいですし、ミスの原因も突き止めにくくなります。ですのであえて上記の例のような書き方をします。見やすければどんな書き方でも良いのですが、ポイントは「if文」の構造が分かるように書くこと。上の例のように「if(条件)」「else if(条件)」「else」「{ }」と「{ }内の処理内容」を別の行として分けると同時に、「{ }内の処理内容」を[Tab]や半角スペースでインデント(字下げ)する書き方がよく使われます。字下げに全角スペースは使っちゃダメですよ。個人的には[Tab]がおススメです。[Tab]キー一発。間違えませんし揃えやすいです。


SPONSORED LINK


3. htmlとphpファイルの作成

 それでは実際に作って確かめましょう。そこでまずはhtmlファイルとphpファイルを作成します。これまでもやったように[Xamppフォルダ]→[htdocsフォルダ]→[pkpkisoフォルダ]で、ひな形ファイル「hina.html」を[Ctrl]+[c]してコピー。貼り付け[Ctrl]+[v]を2回すると2つ分コピーができますので、それぞれの名前を「kihon03.html」と「kihon03.php」に変更して下さい。
 作成した2つのファイルを編集して、前回の基本編・データ受渡しと変数でやったように、データの入力・送信と、データの受信・表示の処理を作ります。それぞれのファイルを次のように編集して下さい(ここで時間をかけても仕方ないのでコピペしちゃいましょう)。

  kihon03.html
  

  kihon03.php
  

 念のため意味を簡単に確認。まずkihon03.htmlは、「お名前」の入力を受け付けるテキスト入力欄を作成し、入力された「onamae」という識別名のデータをpostメソッドでkihon03.phpに送信するhtmlページ。
 一方、kihon03.phpは、kihon03.htmlから送られてきた「onamae」データをpostメソッドで受け取り、変数$onamaeにコピーし、echo命令で「こんにちは~さん」と表示するphpプログラムです。「echo 'こんにちは'.$onamae.'さん';」の書き方はわかりますか?前回の基本編・データ受渡しと変数でもやりましたが、ピリオド「.」による変数と文字列の結合です。「こんにちは」と$onamaeと「さん」をピリオド「.」で結合して1つのecho命令で表示するようにしています。
 もう一点補足。変数名$onamaeは、別の名前でも良いのですが、識別名「onamae」として届いたデータなので、混乱を避けるためにもデータ識別名を変数名と同じにしています。
 2つのファイルができたらlocalhost経由で表示して下さい。URLは「http://localhost/phpkiso/kihon03.html」です。Xamppの起動を忘れず。使い方を忘れた人は準備編・Xamppの起動Xamppの設定を要確認です。
 問題なければ左下の入力欄が表示されるので、適当に入力して「送信」をクリック。するとデータが受け渡されて右下のように表示されればOKです。うまくいかない場合はよく見直しましょう。

   

4. if文をサンプルで試す

 それでは先の「kihon03.php」をさらに次のように修正し上書き保存して下さい。「(」と「)」「{」と「}」の対応に注意しましょう。「(」と「)」はキーボード上方の数字[8][9]キーを[Shift]キーを押しながら入力。「{」と「}」はキーボード中段右端の「[」「]」のキーを[Shift]を押しながら入力します。ややこしいですが慣れましょう。

  kihon03.php(php部分以外は省略)
  

 説明します。1行目はOK。2行目も「$_POST」に届いたデータを変数$onamaeにコピーしているだけなのでOKでしょう。ここで確認すべきは3行目「if」からです。
 まず「if($onamae=='')」です。「==」はイコール2つですので「左辺と右辺が同じかどうか」という条件になります。ということでこの意味は「変数$onamaeと''が等しいなら」ということになります。「''」は1つのダブルコーテーション「"」ではなく2つのシングルコーテーション「'」です。じゃ「''」って何?ということですが、これは「文字列として何もない」つまり「データ未入力」ということを表しています。
 シングルコーテーションは、文字列を指定するときに使うことはすでに見てきた通り。「'おはよう'」という場合、「おはよう」という箇所が文字列ですよと指定するために「'」と「'」で挟むわけです。ですがこのサンプルでの2つのシングルコーテーションの間には何も入っていません。半角スペースさえ入っておらず「'」が2つ連続しています。このことは「文字列として何もない未入力状態」であることを表します。
 つまり、条件「$onamae==''」の意味は「変数$onamaeと何もない文字列が同じなら」つまり「変数$onamaeに文字列として何も入力されていなければ」「変数$onamaeが未入力なら」ということになります。
 そして続く{ }では「echo 'お名前が入力されていません。';」と指定されていますので、「変数$onamaeが未入力なら、お名前が入力されていません、と表示しなさい」という意味になります。もし「変数$onamaeに何か入力されていれば」条件は満たされないのでこの{ }内の命令は実行されません。
 さらに「else」は先に見た通り「その前の条件が満たされない場合」を表します。そしてここではその場合に「こんにちは~さん」と表示するように設定しています。
 というわけで全体としては「もし変数$onamaeに文字列として何も入力されていなければ、お名前が入力されていません、と表示し、入力されていれば、こんにちは~さん、と表示する」という処理内容になります。
 それでは実際に実行してみましょう。まずは「kihon03.html」にlocalhost経由でアクセスし、そのうえでまずは何も入力せずに「送信」ボタンをクリックしてみます。「kihon03.php」に展開され以下のように表示されたらOKです。

  

 上のように表示されたらブラウザの戻るボタンで「kihon03.html」に戻り適当な名前を入力し、再度「送信」ボタンをクリックします。すると「kihon03.php」には「こんにちは~さん」というメッセージが表示されたと思います。うまくいかない場合は、プログラムをよくチェックしてみましょう。

5. 「else if」を試す

 次に「else if(条件)」についても確認しましょう。これは「もし~ならA処理、違ってもし~ならB処理、それとも違ってもし~ならC処理、いずれも違ったらD処理」という形で、複数の条件が連なるような状況で使うものでした。
 そこでkihon03.phpを次のように修正して下さい。7行目「else if ($onamae=='テスト')」~15行目「else」の前の行までを追加しています。ちょうど元の「if」と「else」の間に入れ込む感じです。カッコの対応に注意して編集して下さい。

  kihon03.php(php部分以外は省略)
  

 最初のif(条件)と続く{ }のところまでは変わりないのでOK。postメソッドでデータを受けとり$onamaeに代入し、データ未入力なら「入力されていません」を表示します。
 ここで大事なのは7行目の「else if」から。この「else if」は、その前の「if(条件)」を受けて「その条件を満たさない場合($onamaeに入力がある場合)、もし$onamaeの内容が'テスト'なら」続く{ }内を実行しなさい、ということになります。{ }内には「テストモード開始しました」と表示するecho命令が設定されています。
 11行目にもまた「else if」があり「else if ($onamae=='てすと')」となっています。つまり、その前の「else if(条件)」を受けて「その条件を満たさない場合($onamaeが'テスト'でない場合)、もし$onamaeの内容が'てすと'なら」続く{ }内の処理を実行するということです。この{ }にはecho命令で「てすとモード開始しました」と表示するよう指定されています。
 そして15行目「else」は、その前の「else if(条件)」を受けて「その条件も満たさないなら($onamaeの内容が'てすと'でもないなら)」続く{ }内のecho命令で「こんにちは~さん」と表示する、ということになっています。
 もちろん「if(条件)」や「else if(条件)」が満たされて続く{ }内の処理が実行されると、それ以降の「else if」や「else」に続く処理は実行されることなく一連の「if文全体」は処理完了となります。
 kihon03.phpの修正が終わったらサーバーlocalhost経由でアクセスして確かめてみましょう。まずkihon03.htmlにアクセスしてデータ入力してみて下さい。以下のイメージのように入力ごとに結果が変わればOKです。

  


SPONSORED LINK


7. if文の入れ子

 例えば、アンケートでは「性別を聞いて、男性と答えたら次に自動車を保有しているか尋ね、女性と答えたら次に旅行好きかを尋ねる」といった具合に、質問の提示が階層的に分岐する状況があります。if文のプログラムでも、このような階層的な条件分岐はよく行われますが、そのようなときに使われるのが「if文の入れ子」です。
 これもサンプルで確認しましょう。ますますややこしいですが、kihon03.phpを以下のように修正して下さい。修正箇所は、3行目に「$pass='ppp';」を追加したことと、16行目のelseに続く{ }の中に「if~else文」を入れ子にして追加したことです。

  kihon03.php(php部分以外は省略)
  

 複雑になってきましたがよく見ましょう。元の「if文の構造」の中にもう一つの「if文の構造」があることがわかりますか?このサンプルでは16行目「else」に続く{ }の中に「if~else」が入っています。これが「if文の入れ子」です。
 内容を確認します。まず3行目に「$pass='ppp';」を追加しました。これは「ppp」という文字を変数$passに代入している、ということです。
 次の「if(条件)」や「else if(条件)」は先ほどから変化ありませんのでOKですね。問題はその次のelseに続く{ }の中です。ここではまず「if($pass=='ppp')」となっていますので、「変数$passと文字列'ppp'が等しければ、「こんにちは~さん」と表示する、ということです。ただ「if($pass=='ppp')」が満たされない場合、次のelseに続く{ }内が実行され「パスワードが違います」と表示されます。当然このサンプルでは3行目で「$pass='ppp';」と設定していますので、「こんにちは~さん」が表示されます。
 ところで、このサンプルでは、「elseに続く{ }内」に「if文」を入れ子にしましたが、「if(条件)に続く{ }内」でも「else if(条件)に続く{ }内」でも「if文」を入れ子にすることができます。
 さらには、ここでは「if文」の中に「if文」を入れるという形で2段階でしたが、さらにもう一つ、さらにさらにもう一つと多段に入れ込んでいくことも可能です。工夫次第でかなり複雑な条件設定も実現できます。
 内容が理解できたらlocalhost経由でkihon03.htmlにアクセスし実際に動作させてみましょう。ここで試したいのは何か名前を入れたとき。例えば「太郎」と入力したら「おはよう太郎さん」と表示されるか確かめて下さい。

 ここで確認したサンプルは、Webアプリケーションでしばしば見かける「入力チェック処理」の簡易版です。ユーザー登録でもシステムへのログインでも空欄のままでは進めませんし、不正な入力があった場合にはメッセージを出して入力しなおすよう求めたりします。実際にはもう少し複雑な仕組みになっていますが、このサンプルのような仕組みが基本となります。

練習問題

 このページで用いたファイルkihon03.htmlとkihon03.phpを使い、以下の課題に取り組みましょう。
  1. kihon03.htmlの「お名前」の下に「ご住所」を入力する<input type="text" name="jusyo" size="30">タグを設定し、kihon03.phpにはそのデータを受け取り、入力されていなければ「住所が入力されていません」と表示し、入力されていれば「こんにちは~さん」の下に「ご住所:~」として表示する命令を追加しなさい。
  2. 上で追加したkihon03.htmlの「ご住所」の下に、さらに「パスワード」を入力する<input type="password" name="pass" size="10">タグを設定し、kihon03.phpにはそのデータを受け取り、パスワードが未入力なら「パスワードが未入力です」と表示し、パスワードが「ppp」なら上の問題で作成した「ご住所:~」の後に「パスワードOK」と表示し、パスワードが違う場合には「パスワードが違います」と表示する命令を追加しなさい。なお、パスワードが違う場合に「パスワードが違います」と表示される処理については、このページのサンプルですでに作成してあれば、そのまま活かして良い。
練習問題の出力例



関連リンク



SPONSORED LINK





ページのトップへ戻る
SPONSORED LINK