• ベストアンサー

if文が入れ子の場合の条件の解釈

以下のようにif文が入れ子の場合についての質問です。 if(条件1){ if(条件2){ 実行内容1 } }else{ 実行内容2 } このような場合、条件1がTrueでも条件2がFalseであれば、実行内容2が実行されるのでしょうか?それともこのような場合、両方の実行内容(実行内容1及び2)が実行されないのでしょうか? もしも、上記で実行内容2が実行されない場合: やはり、条件1がTrueで、かつ、条件2=Trueの場合以外は全て実行内容2が実行されるようにするには、下記のように「and」で条件を繋ぐしかないのでしょうか? if(条件1 and 条件2){ 実行内容1 }else{ 実行内容2 } 「and」で条件を繋ぐ場合、各条件が長いとコードが見にくくて大変不便です。 何か良い方法をお知りでしたら、お教え下さい。記述方法が記載されているサイトのURL等でも結構です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nicolish
  • ベストアンサー率72% (13/18)
回答No.6

>if(条件1 and 条件2){ > 実行内容1 >}else{ > 実行内容2 >} >「and」で条件を繋ぐ場合、各条件が長いとコードが見にくくて大変不便です。 andよりも&&の方が個人的に見やすいと思う。まあそこは好みとして。 if ( (($year % 400) === 0 || ($year % 4 === 0 && $year % 100 !== 0) ) && $month >= 7 && $month <= 9) 死にたくなるほど分かりにくい。 案1:説明用変数の導入 $is_uruu_year = ($year % 400) === 0 || ($year % 4 === 0 && $year % 100 !== 0); $is_summer = $month >= 7 && $month <= 9; すると最初の条件判定はこう書ける。 if($is_uruu_year and $is_summer) 案2:メソッドの抽出 function isUruuYear($num){  return ($num % 400) === 0 || ($num % 4 === 0 && $num % 100 !== 0); } function isSummer($num){  return $num >= 7 && $num <= 9; } こう書ける。 if(isUruuYear($year) && isSummer($month)){ さらに、「うるう年かつ夏」という期間が、例えばあなたの店で「超ハイパー割引期間」という意味ならば、それを意味する関数も追加するといい。 function isSuperHyperDsicountPeriod($year, $month){  return isUruuYear($year) && isSummer($num); } するとANDすら不要になり、単にこう書ける事になる。 if(isSuperHyperDiscountPeriod($year, $month)) ともに、Fowler著『リファクタリング』に詳しい。 「うるう年かどうか」と、「年が400の倍数あるいは4の倍数かつ100の倍数でないか」を判定するのとでは、論理のレベルが違う。 うるう年かどうかを気にしている部分では、isUruuYear()のような関数だけを実行し、うるう年かどうかの判定処理はその関数の中に切り出すようにするといい。

kitty1000
質問者

お礼

nicolishさん ご回答、ありがとうございました。 詳しいご説明ありがとうございました。nicolishさんは、人に説明するのが上手ですね。

その他の回答 (5)

  • 7tv3mm
  • ベストアンサー率75% (12/16)
回答No.5

質問(入れ子)から逸れてしまうので参考にならないかもしれませんが、 最初に基本の実行内容を記述したPHPファイルを指定し、条件に合致した 場合に、別のPHPファイルに変更するとかは? $incl = '実行内容2.php'; if(条件1 && 条件2) $incl = '実行内容1.php'; require_once($incl);

kitty1000
質問者

お礼

7tv3mmさん ご回答、ありがとうございました。 参考にさせて頂きます。

回答No.4

んと、だから・・・ if (1 + 2 + 3 + 4 + 5 + 6 + 7 == 28 and 1 * 2 * 3 * 4 * 5 == 120){ } って書くのが長いから function a(){ return 1 + 2 + 3 + 4 + 5 + 6 + 7 == 28 } function b(){ return 1 * 2 * 3 * 4 * 5 == 120 } ってのを定義すれば if (a() and b()){ } ってなってこっちはすっきりするでしょ? 関数にしないで c = (1 + 2 + 3 + 4 + 5 + 6 + 7 == 28) d = (1 * 2 * 3 * 4 * 5 == 120) if (c and d)でも十分かもしれない ===================== >実行内容3と2を同じにすることで そうだね。でも同じことを二回書くと一つ修正したくなったときに二箇所両方直さなきゃいけない。 function ishogetrue(){ if(条件1){  if(条件2){   retrurn true;  }else{ return false; } }else{ return false; } } とかやって if (ishogetrue()){ 実行内容1 }else{ 実行内容2 } とかやった方がきれいにはまとまりそうかなあ

kitty1000
質問者

補足

himajin100000さん ご回答、ありがとうございました。 了解しました。参考にさせて頂きます。

回答No.3

悩みを完全に勘違いした >下記のように「and」で条件を繋ぐしかないのでしょうか? 多分ね。でも,その部分を関数に分けてしまえば見やすくなるんじゃないの?

kitty1000
質問者

補足

himajin100000さん ご回答、ありがとうございました。 >でも,その部分を関数に分けてしまえば見やすくなるんじゃないの? やり方をもう少し教えて下さい。サイトのURL等でも結構です。 ちなみに、先ほどお教え頂いた下記のコードは問題なく実行可能なんですよね?この場合、実行内容3と2を同じにすることで目的の結果が得られるように思いますが。 if(条件1){  if(条件2){   実行内容1  }else{ 実行内容3 } }else{  実行内容2 } 条件1 条件2 true  true  実行内容1 true  false  実行内容3 false      実行内容2

回答No.2

if(条件1){  if(条件2){   実行内容1  }else{ 実行内容3 } }else{  実行内容2 } 条件1 条件2 true  true  実行内容1 true  false  実行内容3 false      実行内容2

kitty1000
質問者

補足

himajin100000さん ご回答、ありがとうございました。 参考にさせていただきます。

noname#77845
noname#77845
回答No.1

if(条件1){  if(条件2){   実行内容1  } }else{  実行内容2 } になるので、 条件1 条件2 true  true  実行内容1 true  false  実行無し false      実行内容2 になります。 また、 if(条件1 and 条件2){ については、その通り。

kitty1000
質問者

補足

edomin2004さん ご回答、ありがとうございました。 やはり、条件1がTrueで、かつ、条件2=Trueの場合以外は全て実行内容2が実行されるようにするには、下記のように「and」で条件を繋ぐしかないのでしょうか? if(条件1 and 条件2){ 実行内容1 }else{ 実行内容2 } 「and」で条件を繋ぐ場合、各条件が長いとコードが見にくくて大変不便です。 何か良い方法をお知りでしたら、お教え下さい。記述方法が記載されているサイトのURL等でも結構です。

関連するQ&A