IF文の記述をシンプルにする方法

このQ&Aのポイント
  • IF文を簡潔に記述する方法について教えてください。
  • IF文のネストを減らしてシンプルに書く方法を教えてください。
  • 27通りの処理を行うIF文をより簡単な方法で書く方法を教えてください。
回答を見る
  • ベストアンサー

IF文の記述をシンプルにする方法

いつもお世話になります。 下記のようにIF入れ子で分岐をして3×3×3で27通りの処理をさせたいのですが、もっとシンプルに記述方法があれば御指導お願い致します。 if($asa_ch==1 and $asa_ch_ok ==1){  if($hiru_ch==1 and $hiru_ch_ok == 1){   if($yoru_ch ==1 and $hiru_ch_ok ==1){ $flag = 1;   }elseif($yoru_ch ==2 and $hiru_ch_ok ==1){ $flag = 2;   }elseif($yoru_ch ==3 and $hiru_ch_ok ==1){ $flag = 3;   }  }elseif($hiru_ch==2 and $hiru_ch_ok == 1){   if($yoru_ch ==1 and $hiru_ch_ok ==1){        $flag = 4;   }elseif($yoru_ch ==2 and $hiru_ch_ok ==1){ $flag = 5;   }elseif($yoru_ch ==3 and $hiru_ch_ok ==1){ $flag = 6;   }  }elseif($hiru_ch==3 and $hiru_ch_ok == 1){   if($yoru_ch ==1 and $hiru_ch_ok ==1){ $flag = 7;   }elseif($yoru_ch ==2 and $hiru_ch_ok ==1){ $flag = 8;   }elseif($yoru_ch ==3 and $hiru_ch_ok ==1){ $flag = 9;   } }elseif($asa_ch==2 and $asa_ch_ok ==1){  if($hiru_ch==1 and $hiru_ch_ok == 1){   if($yoru_ch ==1 and $hiru_ch_ok ==1){       $flag = 10;   }elseif($yoru_ch ==2 and $hiru_ch_ok ==1){ $flag = 11;   }elseif($yoru_ch ==3 and $hiru_ch_ok ==1){ $flag = 12;   }  }elseif($hiru_ch==2 and $hiru_ch_ok == 1){   if($yoru_ch ==1 and $hiru_ch_ok ==1){ $flag = 13;   }elseif($yoru_ch ==2 and $hiru_ch_ok ==1){ $flag = 14;   }elseif($yoru_ch ==3 and $hiru_ch_ok ==1){ $flag = 15;   }  }elseif($hiru_ch==3 and $hiru_ch_ok == 1){   if($yoru_ch ==1 and $hiru_ch_ok ==1){       $flag = 16;   }elseif($yoru_ch ==2 and $hiru_ch_ok ==1){ $flag = 17;   }elseif($yoru_ch ==3 and $hiru_ch_ok ==1){ $flag = 18;   } }elseif($asa_ch==3 and $asa_ch_ok ==1){  if($hiru_ch==1 and $hiru_ch_ok == 1){   if($yoru_ch ==1 and $hiru_ch_ok ==1){ $flag = 19;   }elseif($yoru_ch ==2 and $hiru_ch_ok ==1){ $flag = 20;   }elseif($yoru_ch ==3 and $hiru_ch_ok ==1){ $flag = 21;   }  }elseif($hiru_ch==2 and $hiru_ch_ok == 1){   if($yoru_ch ==1 and $hiru_ch_ok ==1){ $flag = 22;   }elseif($yoru_ch ==2 and $hiru_ch_ok ==1){ $flag = 23;   }elseif($yoru_ch ==3 and $hiru_ch_ok ==1){ $flag = 24;   }  }elseif($hiru_ch==3 and $hiru_ch_ok == 1){   if($yoru_ch ==1 and $hiru_ch_ok ==1){       $flag = 25;   }elseif($yoru_ch ==2 and $hiru_ch_ok ==1){ $flag = 26;   }elseif($yoru_ch ==3 and $hiru_ch_ok ==1){ $flag = 27;   } } }

  • PHP
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
noname#77845
noname#77845
回答No.2

#1です。 if($asa_ch_ok == 1 and $hiru_ch_ok == 1){  if($asa_ch>=1 and $asa_ch<=3 and $hiru_ch >=1 and $hiru_ch<=3 and $yoru_ch>=1 and $yoru_ch<=3){   $flag = ($asa_ch - 1) * 9 + ($hiru_ch - 1) * 3 + $yoru_ch;  } } の方がいいかも…。 (インデントのために全角スペース使ってます。)

nicolemen
質問者

お礼

edomin2004様 ありがとうございます。 動作を確認し改めて感動しました。 ダラダラと長文になって困っていましたが、 本当にこんなに短くなってすっきりできて感動です。 ありがとうございました。

その他の回答 (1)

noname#77845
noname#77845
回答No.1

こういうことでしょうか? if($asa_ch_ok == 1 and $hiru_ch_ok == 1){  $flag = ($asa_ch - 1) * 9 + ($hiru_ch - 1) * 3 + $yoru_ch; }

関連するQ&A

  • if文のもっとスマートな書き方

    お分かりになられる方ご教授ください 下記のようなIF文を書きました if ($name =="6メートル" and $keta =="10メートル") { $kingaku=$a10; }elseif ($name =="6メートル" and $keta =="15メートル") { $kingaku=$a15; }elseif ($name =="6メートル" and $keta =="20メートル") { $kingaku=$a20; }elseif ($name =="6メートル" and $keta =="25メートル") { $kingaku=$a25; }elseif ($name =="6メートル" and $keta =="30メートル") { $kingaku=$a30; }elseif ($name =="6メートル" and $keta =="35メートル") { $kingaku=$a35; }elseif ($name =="6メートル" and $keta =="40メートル") { $kingaku=$a40; }elseif ($name =="6メートル" and $keta =="45メートル") { $kingaku=$a45; }elseif ($name =="6メートル" and $keta =="50メートル") { $kingaku=$a50; } }elseif ($name =="10メートル" and $keta =="10メートル") { $kingaku=$b10; } }elseif ($name =="10メートル" and $keta =="15メートル") { $kingaku=$b15; } }elseif ($name =="10メートル" and $keta =="20メートル") { $kingaku=$b20; } }elseif ($name =="10メートル" and $keta =="25メートル") { $kingaku=$b25; } }elseif ($name =="10メートル" and $keta =="30メートル") { $kingaku=$b30; } }elseif ($name =="10メートル" and $keta =="35メートル") { $kingaku=$b35; } }elseif ($name =="10メートル" and $keta =="40メートル") { $kingaku=$b40; } }elseif ($name =="10メートル" and $keta =="45メートル") { $kingaku=$b45; } }elseif ($name =="10メートル" and $keta =="50メートル") { $kingaku=$b50; } else { $kingaku="-"; } とにかく長いです。。。 これをもっとスマートに書く方法はございますでしょうか? 恐れ入りますがお分かりになられる方教えて下さい

    • ベストアンサー
    • PHP
  • マクロ VBA 配列内の比較方法

    いつも大変御世話になっております。 WiindowsXP環境にある【D:\】フォルダ内に【マクロ.xls】があります。 そのファイル内にはボタンがあり、 ボタンを押すとマクロが稼働します。 そのプログラムには数字を格納する配列 FLAG(1 to 10) があり 毎回ボタン押すごとに入る数字が違います。 入る数字は 1 と 0 しか入らない仕組みです。 例) 1001101101 や 0110100110 のように毎回違います。 問題はその後のプログラムなのですが 都合上、 (1)3桁目と5桁目が1の場合 (2)4桁目と6桁目が1の場合 (3)4桁目と7桁目が1の場合 (4)7桁目と8桁目が1の場合 であってはいけないので それをチェックするプログラムを作成したのですが、 下記のような長ったらしい文になりました。 ---------------------------コード開始--------------------------- (省略) If FLAG(3) = 1 And FLAG(5) = 1 Then GoTo NG: ElseIf FLAG(4) = 1 And FLAG(6) = 1 Then GoTo NG: ElseIf FLAG(4) = 1 And FLAG(7) = 1 Then GoTo NG: ElseIf FLAG(7) = 1 And FLAG(8) = 1 Then GoTo NG: Else GoTo OK: End If NG: MsgBox "NG" Exit Sub OK: MsgBox "OK" (省略) ---------------------------コード終了--------------------------- もっと綺麗なコード設計は可能でしょうか? もしご存知の方がいらっしゃるようでしたら、お手数ですがご教授願いますでしょうか? 以上、何卒宜しくお願い致します。

  • ちょっとした記述に関する疑問

    どちらでもいいような内容かもしれませんが、よろしくお願いします。 ---------------------------------- flag = false; if(num < 0) { num *= -1; flag = true; } //numを使って何かの処理 ~~ if(flag) { //処理 num *= -1; } ---------------------------------- 例として、変数numが負だったらフラグをtrueにして、 最後にそのフラグをもとに処理を行うという一連の動作があった場合に、 if(num < 0) { num *= -1; flag = true; } というふうにフラグを後に記述するのか if(num < 0) { flag = true; num *= -1; } というふうにフラグを先に記述するのか がふと気になったのですが、みなさんはどちらでやっているのでしょうか?

  • if文での記述の仕方がわからなくて困っています

    winxp flash8です。いつもありがとうございます。 if分で分岐したいのですが記述の仕方が違っているらしくスクリプトが通らなくて困っています。下記のようにかいています。 if (eval ("atari" + i) == 0)が違うようです。 // 30個のブロックをfor文で処理する for (i = 0; i < 30; i++) { if (flg[i] == 1) { continue; } // 次のループへ // ボールとブロック t i 番目 が当たったとき if (this._parent.tama0.hitTest (eval ("this._parent.t" + i))) { trace((eval ("atari" + i))); if (eval ("atari" + i) == 0) { //シルエットをとる eval ("this._parent.t" + i).gotoAndStop (1); set(eval ("atari" + i), 1); } else if (eval ("atari" + i) == 1) { // ブロックを非表示に eval ("this._parent.t" + i)._x = 77; eval ("this._parent.t" + i)._y = -100; flg[i] = 1; // 消えた事をあらわすフラグ

    • ベストアンサー
    • Flash
  • 条件判断の記述方法

    いつも下記のような記述でまよってしまいます。 どちらがスマートな書き方なのでしょうか。 もしくはそもそもの書き方がおかしいでしょうか。 [記述方法1] foreach( string s in k.keys ) { if( s == "ok" ) goto OK; } //NGな処理 return false; //OKな処理 OK: return true; [記述方法2] bool ok_flg = false; foreach( string s in k.keys ) { if( s == "ok" ) { ok_flg = true; break; } } if( ok_flg ) { //OKな処理 }else{ //NGな処理 } return ok_flg;

  • PHPのIF文で条件の記述の仕方について

    PHPのIFを用いて、データベースから取り出した特定のレコードが 変数に入っている値と一致する場合とそうでない場合で処理を分けたいと考えています。 変数に入っている値と一致する場合は 指定したURLへリダイレクトされるようにしたいです。 以下のようにIF分を書いても条件に引っかからず 次の処理に進んでしまいます。 ※testレコードに入っている値はredirectです。 ------------ $db = mysql_query('SELECT * FROM redirect_records WHERE user_id='.$userid, $connect); $db = mysql_fetch_array($db); $Comparison1=$db['test']; $Comparison2='redirect'; if ($Comparison1 == $Comparison2){ $url = '/redirect/test'; $form_state['redirect'] = $url; } ------------ 記述の仕方が間違っているのでしょうか。 PHPに関してはまだまだ初心者で原因がわかりません。 具体的には上記のIF分はIF分の中に入れ子になっています。 ボタンをクリックした時にtestレコードに入っている値がredirectなら/redirect/testへ それ以外は次の処理へと進んでほしいです。 ------------ function form_submit($form, &$form_state) { global $user,$order,$item; if ($_SESSION['checkout_valid'] === FALSE) { $url = '/checkout'; } elseif ($_SESSION['checkout_valid'] !== FALSE) { $db = mysql_query('SELECT * FROM redirect_records WHERE user_id='.$userid, $connect); $db = mysql_fetch_array($db); $Comparison1=$db['test']; $Comparison2='redirect'; if ($Comparison1 == $Comparison2){ $url = '/redirect/test'; $form_state['redirect'] = $url; } } ------------ このようにelseifの中の処理でさらにtestレコードにredirectが入っている場合は <URL>/redirect/testに飛ぶようにしたいです。 「環境」 PHP 5.2.17 MySQL 5.1.59 どうかお助けください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 長いIF文を短くしたい

    よろしくお願いします いつもgooのみなさんに大変お世話になっております マクロは2カ月ほど前から勉強しています お陰様で、私のマクロも日々進歩できています エクセルのバージョンは2013です 質問内容 長いIF文を短くしたい IF 条件1 and 条件2 and 条件3 and 条件4 and 条件5 Then   処理 End If このようにIF文が長いために、マクロ編集画面が見にくくなっています Select Case を使わずに短くする方法はないでしょうか?

  • IF文の使い方を教えてください

    もし A5001 に データがあるのなら処理を中止し、データが無ければ処理を継続する。内容のマクロを考えてますが、 A5001にデータがないなら処理を中止は下記の記述で良いかと思いますが、 逆にあったら処理を中止する記述はどうすればよいのですか? Value が怪しいかと思うのですが・・・・ お願いします。 If Range("読み込み!A5001").Value = "" Then MsgBox "データがありません", vbOKOnly, "データ有無確認" Exit Sub End If ret = MsgBox("過去のシュミレーションデータを削除します。よろしいですか?", vbYesNo + vbQuestion, "データ削除実行確認") If ret = vbNo Then Exit Sub End If

  • IF文の使用制限について(VBA)

    いつもお世話になります。 VBAで分からない事があったので、質問をすることにしました。 お手数をおかけしますが、よろしくお願いします。 現在、以下のようなコードを記述しています。 例) IF x > y AND x <= z then ”処理” End If 値「x」がyよりも大きくて、zより小さいかもしくは同じ値の場合は処理をする。 というようなコードを記述しています。 順調に作業を進めていたのですが、1つのFunction?内に合計25個の 例で挙げたIF文を記述しているのですが、最後の25個目まで正しく処理されるでしょうか? 一つのFunctionで、IF文の使用できる回数制限みたいなものは存在するのでしょうか? どうしても、後半の3つのIF文だけ正しく処理されなくて困っています…。 コードは何回も見直したので間違っていないと思うのです…。 もし、IF文の使用個数の制限など無いというのであれば、もう一度見直してみたいと思います。 質問は以上となります。 よろしくお願いいたします。

  • IFとか条件分岐するSELECT文

    IFとか条件分岐するSELECT文 mytableというテーブルを設け、好きな家電メーカーを3つ挙げてもらい、kaisya1、kaisya2、kaisya3にInsertしました。 また、3つのうち、一番好きなメーカーを社名フラグ(kaisyaFlg;0か1か2で)にInsertしました。 これらの4フィールドを参照し、「一番好きなメーカーリスト」を出すselect文をご教示ください。 PHP側でやるなら、こうなるのでしょうが、MySQL側で「スマートに(?)」処理できないでしょうか。 if ($kaisyaFlg = 0) { $kaisya = $kaisya1; } elseif ($kaisyaFlg = 1) { $kaisya = $kaisya2; } elseif ($kaisyaFlg = 2) { $kaisya = $kaisya3; } echo "一番好きなメーカーは、" . $kaisya;

    • ベストアンサー
    • MySQL

専門家に質問してみよう