プロが教えるわが家の防犯対策術!

条件分岐(if)についてお聞きしたことがあります。
例えば
if($a == 'A' || $a == 'B'){
処理
}else if($a == 'C' || $a == 'D' || $a == 'E'){
処理
}...............
といった条件分岐があったとて、お聞きしたいことが2点あります。
・条件分岐この後も数十個続いたとします。その場合もelse ifで一つ一つ
条件を書かなければならないのでしょうか?
・条件式if($a == 'A' || $a == 'B'....)が長くなる場合プログラムが見にくくなるので
別途に条件式を書いておいてif文の所では($a == ◯)といったように簡潔に書くことは
できないのでしょうか?

宜しくお願いします。

A 回答 (4件)

・条件分岐この後も数十個続いたとします。

その場合もelse ifで一つ一つ
条件を書かなければならないのでしょうか?

あるいは#1の回答にあるようにswitchを使うかでしょう。
三項演算子はよほど気をつけて使わないと何をしているのか意味不明なコードを量産するので、素人にはお勧めできません。

・条件式if($a == 'A' || $a == 'B'....)が長くなる場合プログラムが見にくくなるので
別途に条件式を書いておいてif文の所では($a == ◯)といったように簡潔に書くことは
できないのでしょうか?

$a == ○という書き方はできませんが、条件判定をする関数なら書けます。
function condition1($a) {
return $a == 'A' || $a == 'B';
}

if (condition1($a)) {
処理
}
のような感じで。

あるいは、連想配列を作って、キーにマッチした場合に特定の処理をするという場合はこういう書き方もできます。
function normal_print($x) {
echo $x;
}

function hello_print($x) {
echo "hello " . $x;
}

$rules = array(
'A' => normal_print,
'B' => hello_print,
'C' => hello_print,
);

$in = 'B';
foreach ($rules as $charactor => $procedure) {
if ($in == $charactor) { $procedure($in); }
}
こうすると、連想配列のキー一つ一つとマッチングをとって、マッチした場合は値として入っている関数を呼び出します。なお、関数が実行されるのは別のスコープになるので引数でちゃんと必要な値を渡しておく必要があり、元の環境の値を変更する場合はそういう処理を書かなくてはいけません。

上記二つを組み合わせて、ある条件にマッチしたら、所定の処理をさせることもできます。
$rules =
array(
// condition, procedure.
array(
function($x) { return $x == 'A' || $x == 'B'; },
function($x) { return 'This is ' . $x; }),
array(
function($x) { return $x == 'C' || $x == 'D'; },
function($x) { return 'My name is ' . $x; }),
);

$in = 'B';
foreach ($rules as $rule) {
$condition = $rule[0];
$procedure = $rule[1];
if ($condition($in)) { print $procedure($in); }
}
こうすると条件式と処理を一カ所でまとめて管理できます。

参考までに。
    • good
    • 0

まず$aがAであった場合$aはC~Eにはならないのでelseはいりません


それだけで構造はだいぶ簡潔になります
また同じ変数をorで確認するだけならswitchかin_arrayで処理すると
ソースも見やすくなります

if(in_array($a,array('A','B'))) 処理1;
if(in_array($a,array('C','D','E'))) 処理2;
    • good
    • 0

> ・条件分岐この後も数十個続いたとします。

その場合もelse ifで一つ一つ条件を書かなければならないのでしょうか?

if~else ifを使うなら、書かなければならない。ただし、本当にそれだけの条件分岐が必要な場合。
その前の段階で、整理しておくのがよいでしょう。

例えば、
if($a == 'A' || $a == 'B'){
$data='DATA1' ;
}else if($a == 'C' || $a == 'D' || $a == 'E'){
$data='DATA2' ;
}..............
とかだったら、あらかじめ対応表を配列にしておいて
$data=$table[$a] ;
みたいにすればすっきりする。

例えば、特定のパターンがあって、正規表現を使って表現できるものなら
if( preg_match('/^[AB]$/',$a) === 1 ) {
処理1 ;
}
のような方法もある。


どの方法が使えるかは、そのケース次第です。万能の方法はありません。
本当に条件が複雑で、まとめられなければ、if~else ifを数十個続けるくらいしかありません。
# でも、その場合は、やりかた自体を根本的に考え直した方がいいです。
    • good
    • 0

詳細なやりたいことが分からいので、参考にならなかったらすみません。



以下のサイトを参考にしてみてください。

switch文を使う方法。
三項演算子を使う方法。

参考URL : http://www.php-labo.net/tutorial/php/if.html#swi …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!