質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

7回答

2859閲覧

複数の条件分岐が発生する処理の実装について

ksyunnnn

総合スコア60

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/08/07 02:48

編集2017/08/07 04:46

複数の条件分岐が発生する処理の実装について知りたいことがあります。

たとえば、下記の図のようにⅠ~Ⅳの、値にパターンのある変数が渡され
そのパターンの組み合わせによって処理を①~⑤に振り分ける場合、どんなプログラムの書き方がありうるでしょうか。

イメージ説明

if文に&&とか||で実装する方法しか思いつかないのですが、その他に綺麗な書き方、効率の良い書き方があれば知りたいです。
※自分が使っているのはPHPですが、他の言語でもどんな書き方があるのか知りたいです。

抽象的な質問で恐縮ですが、あまり自分以外の方の実装をみることが少なく後学のために興味を持ったので質問させていただきました。

よろしくお願いいたします。

追記

みなさんからのコメントを頂く前に、自分が書こうとしていたコードを晒します。。!
(いまコメントを確認すると、こんな書き方はしなくてもすみそうですが。。。)

php

1if( 2 ( empty($params['I']) && $params['II'] == "0" && empty($params['III']) 3 || ( empty($params['I']) && $params['III']=="0" ) 4 || ( !isset($params['I']) && $params['II'] =="0" && empty($params['III']) && empty($params['IV']) ) 5 || ( /*....省略*/ ) 6 ) 7 { 8 /* 処理① */ 9}elseif (/*....省略*/) { 10 /* 処理② */ 11}

追記2

質問の文章が悪く恐縮ですが、元々の図の値の意図としては下記でした。

1 ・・・ 文字列の1
0 ・・・ 文字列の0
無 ・・・ 値が空 ""
無効 ・・・ 変数が存在しない

※念のため追記しておきます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2017/08/07 02:52

画像が小さくどのような組み合わせかわかりにくいので別の画像はありませんか?また、ご自身で書かれたコードを質問文に追記されてはいかがでしょう。
ksyunnnn

2017/08/07 02:59

ありがとうございます。画像更新しました!自分のコードも載せてみます!
ksyunnnn

2017/08/07 04:33

コードも追記してみました!
guest

回答7

0

複雑な条件分岐は連想配列(オブジェクト)で。おそらくもっともメンテナンスしやすい記述方式です。

javascript

1 2// 条件はこんな風に文字列で入ってきてるものとします 3var c1 = "無"; 4var c2 = "0"; 5var c3 = "無"; 6var c4 = "有"; 7 8// 各処理メソッド 9var F1 = function(){ return "処理1";}; 10var F2 = function(){ return "処理2";}; 11var F3 = function(){ return "処理3";}; 12var F4 = function(){ return "処理4";}; 13var F5 = function(){ return "処理5";}; 14 15// 条件を文字列連結します 16var index = C1 + C2 + C3 + C4; 17 18// 条件データをオブジェクトで用意します 19var data = { 20 "無無無有" : F4, 21 "無無無無" : F4, 22 "無無0無" : F1, 23 "無無1無" : F3, 24 "無0無有" : F1, 25 "無0無無" : F1, 26 "無00無" : F1, 27 "無01無" : F3, 28 (以下略) 29}; 30 31// 条件のメソッドを呼び出します。 32(data[index])(); 33

投稿2017/08/07 04:41

zohnam

総合スコア1441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ksyunnnn

2017/08/07 04:47

たしかに、かなりスマートですね!functionが変数に格納できるからこそ実現できる方法なのかなあと。かなり参考になります。ありがとうございます!
guest

0

ベストアンサー

四次元配列

例えば、四次元配列を作る。

JavaScript

1'use strict'; 2var sample = (function () { 3 function process1 () { return '処理1'; } 4 function process2 () { return '処理2'; } 5 function process3 () { return '処理3'; } 6 function process4 () { return '処理4'; } 7 function process5 () { return '処理5'; } 8 9 var setting1 = ['無', '無効', '有効'], 10 setting2 = ['無', 0, 1], 11 setting3 = ['無', '有'], 12 processList = [[[[process4, process4]]]]; 13 14 return function sample (a, b1, b2, c) { 15 return processList[setting1.indexOf(a)][setting2.indexOf(b1)][setting2.indexOf(b2)][setting3.indexOf(c)](); 16 }; 17}()); 18 19console.log(sample('無', '無', '無', '有')); 20console.log(sample('無', '無', '無', '無'));

派生形

四次元配列の派生形はいくつかありますね。

  • 四次元 Map を使う
  • オブジェクト初期化子を使う
  • 3進数でフラグを立て、10進数に変換して、一次元配列のindexとする

参考になりそうな過去スレッド。

Re: ksyunnnn さん

投稿2017/08/07 03:53

編集2017/08/07 03:55
think49

総合スコア18166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ksyunnnn

2017/08/07 04:55

過去スレッドの提供までいただきありがとうございます。このスレッド主の質問の意図、僕の質問とかなり近いですね。。! いただいたコードについてですが、自分では絶対に思いつけなかった書き方なので参考にさせていただきます。javascriptで書かれる方が多いんですね、こういった処理は。。!
ksyunnnn

2017/08/07 05:50

回答いただいたところに質問してしまい申し訳ないのですが、 processList = [[[[process4, process4]]]]; 上記コードの動作だけ理解が及ばず。。これはどんな処理をしているのか、参考記事などでもかまわないのでご教示いただければ幸いですm(_ _)m
ksyunnnn

2017/08/07 09:02

みなさんの回答の中でベストアンサーを選ぶのは難しかったのですが、最終的に自分がコードを書き直す参考になった回答をベストアンサーとしました。 みなさん回答ありがとうございました!
think49

2017/08/07 09:17 編集

> 上記コードの動作だけ理解が及ばず。 JavaScriptは配列初期化子の中で配列初期化子を定義する事が出来ます。 四次元配列を作る為に、配列初期化子を入れ子にして4回定義しています。 https://www.google.co.jp/search?q=%E5%A4%9A%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97+javascript var processList = [[[[process4, process4]]]]; 上記コードは下記コードと等価です。 var processList = [[[[]]]]; processList[0][0][0][0] = process4; processList[0][0][0][1] = process4;
ksyunnnn

2017/08/07 09:16

なるほど、そんなことができるんですね。。! (自分の想像とも近い動作だったので安心しました) 回答いただきありがとうございました!
guest

0

表上で該当なし(-)の部分を「何もしない処理」として(仮に 0 と置きます)、あえてひねくれてみると、
4次元の配列 t を用意する。各次元は、それぞれ I ~ IV に対応するものとする。

PHP

1t = [ 2 '無' => [ 3 '無' => [ 4 '無' => [ '有' => 4, '無' => 4, ], 5 '0' => [ '有' => 0, '無' => 1, ], 6 '1' => [ '有' => 0, '無' => 3, ], 7 ], 8 '0' => [ ...

入力パラメータから配列 t の該当するデータを取り出し、その値をもとに switch で分岐

PHP

1switch(t[p1][p2][p3][p4]) { 2case 0: // 何もしない 3 break; 4case 1: // ①の処理 5 job1(); 6 break; 7... 8}

投稿2017/08/07 03:53

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ksyunnnn

2017/08/07 04:58

わかりやすい説明までありがとうございます! PHPで書くと、switchを利用するのがベターですかね。考え方の参考になります。ありがとうございます!
guest

0

縦横でわけている意味はないですね
以下のような持ち方でよいのでは?

javascript

1[ 2{1:"無",2:"無",3:"無",4:"有",val:4}, 3{1:"無",2:"0",3:"無",4:"有",val:1}, 4・・・・ 5] 6

投稿2017/08/07 03:08

yambejp

総合スコア114883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ksyunnnn

2017/08/07 05:00

すべてのパターンを配列に持っておくということで認識あっていますかね。。? シンプルで書きやすいと感じました。参考にさせていただきます。ありがとうございます!
guest

0

変数の値によって変わるならSwitchも使用してみてはどうでしょうか

lang

1$x = 1; 2Switch(x) { 3 case 1: 4 echo "xは1"; 5 case 2: 6 echo "xは2"; 7}

投稿2017/08/07 03:02

momf

総合スコア416

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ksyunnnn

2017/08/07 05:01

ありがとうございます。 今回で言うと変数の数が複数あるので、Switchのみだとかなり複雑になってしまうきがしているんですよね、、 コメントをいただきありがとうございます!
guest

0

ひとつの変数に複数の値の分岐条件があるのであれば。

通常は、switch 文を使うのでは?

C言語やその他の派生言語も同様に switch 文を使用します。

投稿2017/08/07 03:00

showkit

総合スコア1638

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ksyunnnn

2017/08/07 05:02

ありがとうございます! 今回の場合だと、変数が複数あるのでSwitchだけだと実現が難しいのかな、と思っています。 コメントいただきありがとうございます!
guest

0

私なら、処理と判定を分けます。

PHPはちゃんと書いたことないので疑似コードとして読んでほしいのですが・・・

PHP

1function sw($parm){ 2 if($parm['IV'] == ""){ 3 if($parm['III' == "1"){ 4 if($parm['II' == "1" && !empty($parm['I']) && !$parm['I'] == ""){ 5 return 2; 6 } else { 7 return 3; 8 } 9 ..... 以下判定が続く 10 } 11 ..... 12} 13 14function func1(){ 15 ... 16} 17 18function func2(){ 19 ... 20}

あとは判定後にswitch文などで処理を分けます。
もちろん判定式やそれぞれの処理にも名前を付けます。

PHPはEnumが無いの前提ですが、書き方があればそれを使うとさらにわかりやすく書けます。

前提がわからないのでなんとも云いようがないのですが、入力も丁寧に整形することはできないでしょうか?
例外処理が一緒くたに書かれていないか心配です。

投稿2017/08/07 13:34

編集2017/08/07 13:54
iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問