アプリ版:「スタンプのみでお礼する」機能のリリースについて

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);
}

A 回答 (5件)

<?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);
?>
    • good
    • 0

効率がいいか分かりませんが、配列はどうでしょうか。


種類が増えたら配列に追加すれば対応できます。
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]);
}
    • good
    • 0
この回答へのお礼

papillon68さん、アドバイスありがとうございました。

配列というのはこんな使い方もできるのですね。
いろいろ構文はあるもののなかなか使い倒せなくて
技術アップできていなかったところです。

例外処理の方法までご提示いただき、感謝です。

お礼日時:2006/07/26 22:30

TICKD_VERYSPARSEとかっていう文字が何なのか分かりませんが、


<option>タグのvalueに直接それが入っていれば判定すら要りませんね。
TICKD_VERYSPARSEが定義名であった場合でも、<option>タグに定数値を入れておけば
同様に判定は不要です。
    • good
    • 0
この回答へのお礼

naktakさん、レスありがとうございました。

これは、超コロンブスの卵でした。
ある意味、衝撃的です。
まったくおっしゃるとおりですね。

ちなみに、TICKD_VERYSPARSEは、JpGraphモジュール
が出力するグラフ設定で
メモリの細かさが「非常にまばら」のような
設定値です。

お礼日時:2006/07/26 22:32

視認性重視で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'] にしても良さそうですが、その辺はお好みで。
    • good
    • 0
この回答へのお礼

aqucentさん、レスありがとうございました。

例文までご提示いただきありがとうございました。
たしかにSWITCHというのも、可能ではあるのですね。
SWITCH ...BREAK構文の存在は知ってましたが
実際に導入したことはなかったです。

確かに、可視性はSWITCH文の方が良いですね、
大変参考になりました。

ちなみに、ご示唆されているように、$axis_xは
$_POST['axis_x'] でないと動かないと思われます。
本番環境ではGlobalがOFFですので。。。

お礼日時:2006/07/26 22:35

普通この手の処理は配列でやりませんか?


(こまかく検証していないので、書式は
間違っているかもしれませんが)

<?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]);
?>
    • good
    • 0
この回答へのお礼

yambejpさん、レスありがとうございました。

配列といっても、#2さんとは記述が異なる
アプローチですね。これまた、シンプルで
頭で理解はできるのですが
まったく発想にありませんでした。


それと$tickd_y[$axis_y ]というのは連想配列という
記述になるんでしょうかね。

ともかく、ありがとうございました。

お礼日時:2006/07/26 22:38

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