• ベストアンサー

2つのプルダウンメニュから受けた値に応じIF分岐するのに効率良い方法

2つのドロップダウンメニューから選択された値に応じて、設定項目の引数を変更したいです。 下の例では、それをするのに15回IF分岐しちゃってますが、もっといい方法はないでしょうか。 PHP4+JpGraphでグラフ(散布図)を描かせているのですが、 目盛りの間隔(細かさを)まばら、少、多、自動の4段階で切り替えてます。 <html> <body> Y軸の目盛間隔 <select name="axis_x">  <option value="0" selected>自動</option>  <option value="1">まばら</option>  <option value="2">少</option>  <option value="3">多</option> </select> Y軸目盛間隔 <select name="axis_y">  <option value="0" selected>自動</option>  <option value="1">まばら</option>  <option value="2">少</option>  <option value="3">多</option> </select> </body> </html> if ($axis_y =='0' and $axis_x == '1'){   $graph->SetTickDensity(TICKD_NORMAL,TICKD_VERYSPARSE); } elseif ($axis_y =='0' and $axis_x == '2'){   $graph->SetTickDensity(TICKD_NORMAL,TICKD_SPARSE);       :    ■12セットのelseif文省略←ここが非効率!       : } elseif ($axis_y =='3' and $axis_x == '3'){   $graph->SetTickDensity(TICKD_DENSE,TICKD_DENSE); }

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

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

効率がいいか分かりませんが、配列はどうでしょうか。 種類が増えたら配列に追加すれば対応できます。 if文を追加する必要がないので保守性がアップするかもしれません。 $tickd_x = array("TICKD_NORMAL", "TICKD_VERYSPARSE", "TICKD_SPARSE", "TICKD_DENSE"); $tickd_y = array("TICKD_NORMAL", "TICKD_VERYSPARSE", "TICKD_SPARSE", "TICKD_DENSE"); // 範囲外の値ならグラフを生成させないための処理 if((isset($tickd_x[$axis_x])) && (isset($tickd_y[$axis_y]))) { $graph->SetTickDensity($tickd_y[$axis_y],$tickd_x[$axis_x]); }

litton101
質問者

お礼

papillon68さん、アドバイスありがとうございました。 配列というのはこんな使い方もできるのですね。 いろいろ構文はあるもののなかなか使い倒せなくて 技術アップできていなかったところです。 例外処理の方法までご提示いただき、感謝です。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

普通この手の処理は配列でやりませんか? (こまかく検証していないので、書式は 間違っているかもしれませんが) <?php $tickd_x[0]="TICKD_NORMAL"; $tickd_x[1]="TICKD_VERYSPARSE"; $tickd_x[2]="TICKD_SPARSE"; $tickd_x[3]="TICKD_DENSE"; $tickd_y[0] ="TICKD_NORMAL"; $tickd_y[1] ="TICKD_VERYSPARSE"; $tickd_y[2] ="TICKD_SPARSE"; $tickd_y[3] ="TICKD_DENSE"; $graph->SetTickDensity($tickd_y[$axis_y ],$tickd_x[$axis_x]); ?>

litton101
質問者

お礼

yambejpさん、レスありがとうございました。 配列といっても、#2さんとは記述が異なる アプローチですね。これまた、シンプルで 頭で理解はできるのですが まったく発想にありませんでした。 それと$tickd_y[$axis_y ]というのは連想配列という 記述になるんでしょうかね。 ともかく、ありがとうございました。

すると、全ての回答が全文表示されます。
  • aqucent
  • ベストアンサー率39% (78/200)
回答No.4

視認性重視でswitch文にする手はありますね。 switch($axis_x){ case '0': $tickd_x = "TICKD_NORMAL"; break; case '1': $tickd_x = "TICKD_VERYSPARSE"; break; case '2': $tickd_x = "TICKD_SPARSE"; break; case '3': $tickd_x = "TICKD_DENSE"; break; default: echo '<p>エラー: axis_x の値が不正です</p>'; } switch($axis_x) の値は $_POST['axis_x'] or $_GET['axis_x'] にしても良さそうですが、その辺はお好みで。

litton101
質問者

お礼

aqucentさん、レスありがとうございました。 例文までご提示いただきありがとうございました。 たしかにSWITCHというのも、可能ではあるのですね。 SWITCH ...BREAK構文の存在は知ってましたが 実際に導入したことはなかったです。 確かに、可視性はSWITCH文の方が良いですね、 大変参考になりました。 ちなみに、ご示唆されているように、$axis_xは $_POST['axis_x'] でないと動かないと思われます。 本番環境ではGlobalがOFFですので。。。

すると、全ての回答が全文表示されます。
回答No.3

TICKD_VERYSPARSEとかっていう文字が何なのか分かりませんが、 <option>タグのvalueに直接それが入っていれば判定すら要りませんね。 TICKD_VERYSPARSEが定義名であった場合でも、<option>タグに定数値を入れておけば 同様に判定は不要です。

litton101
質問者

お礼

naktakさん、レスありがとうございました。 これは、超コロンブスの卵でした。 ある意味、衝撃的です。 まったくおっしゃるとおりですね。 ちなみに、TICKD_VERYSPARSEは、JpGraphモジュール が出力するグラフ設定で メモリの細かさが「非常にまばら」のような 設定値です。

すると、全ての回答が全文表示されます。
noname#185101
noname#185101
回答No.1

<?php //すみません、元質問者です。 //投稿後にすごいことを思いつきました。 //↓↓↓これで良かったですね(寒)。 //でも、まだ効率良い方法あったら是非教えてください。 if ($axis_x = '0') {   $tickd_x = "TICKD_NORMAL"; }elseif ($axis_x = '1') {   $tickd_x = "TICKD_VERYSPARSE"; }elseif ($axis_x = '2') {   $tickd_x = "TICKD_SPARSE"; }elseif ($axis_x = '3') {   $tickd_x = "TICKD_DENSE"; } if ($axis_y = '0') {   $tickd_y = "TICKD_NORMAL"; }elseif ($axis_y = '1') {   $tickd_y = "TICKD_VERYSPARSE"; }elseif ($axis_y = '2') {   $tickd_y = "TICKD_SPARSE"; }elseif ($axis_y = '3') {   $tickd_y = "TICKD_DENSE"; } $graph->SetTickDensity($tickd_y,$tickd_x); ?>

すると、全ての回答が全文表示されます。

関連するQ&A