2016-04-23 7 views
0

PHPを使用して変換テーブルを作成していますが、多くのシナリオに対してユーザの入力を確認しなければなりません。私はすべてのシナリオを通過するより簡単な方法を望んでいた。PHPで複数のif文を避ける(配列やその他のオプションを使用する)

私は三元に見て、オプションを切り替えたが、これらは、私はそれが何をする必要があるかやっていないようだと、私はまた私がしようとしているどのような配列の(私は私が使用する必要があると思うオプション)

考えられdo: ユーザは学年レベルで入力し、カテゴリのスコアを入力します。

は13等級(K-12があります....

if ($grade == 1 && $sumScore <= 5) 
{ 
    $textscore = 'Beginning'; 
} 
if ($grade ==1 && ($sumScore>5 && $sumScore <=8)) 
    { 
    $textScore = 'Intermediate'; 
    } 

など:これらのスコアと学年レベルの合計に基づいて、私は2つの他のスコア 例コードを取得し、それらを比較する必要があります)と4つのカテゴリ私はこれらの他の得点を得るために考慮する自分の "生のスコア"ですべてを通過する必要があります。 if/Else if文を大量に使用することを避けるにはどうすればよいですか?

ありがとうございます!

+1

を構築する方法とは少し異なりますそれらの相互関係 – RomanPerekhrest

+0

どのようなロジックが必要ですか?それはいつも($ grade

+0

**など... **あまり役に立ちません。すべてのIFコードを表示すると、何をする必要があるかを知ることができ、より良い方法や他の方法を提案することができます。 – RiggsFolly

答えて

1

13x4の2次元配列を使用できます。次に、ネストされたforループを使用して各可能性を調べ、forループのために一度に1つのステートメントを実行することができます。

例えば、配列は次のようになります。

$textscores = array (
    1 => array(5 => 'Beginning', 8 => 'Intermediate', ...), 
    ... 
    3 => array(5 => 'Intermediate', ...), 
    ... 
); 

ループのネストされたが、このようになります。

foreach($textscores as $grade => $scores) { 
    foreach($scores as $sumScore => $textScore) { 
    if($userGrade == $grade && $userSumScore <= $sumScore) { 
     $userTextScore = $textScore; 
     break 2; 
    } 
    } 
} 
+0

学年のレベルによって異なります。たとえば、グレード1は「生のスコア」が5で「初め」であることができますが、グレード3では「生のスコア」の5を「中間」とすることができます。だから私は彼らがどの学年レベルであるかを知る必要があります。 – Kayla

+0

ええ、各学年ごとに異なる行があります。例を展開します。 –

+0

ループの例を追加しました。 –

0

私が(すみません)、これをテストしていませんが、私は思いますこのようなもの

function getTextScore($grade, $sum) { 

    $rules = array(array("grade" => 1, "minSum" => null, "maxSum" => 5, "textScore" => "Beginning"), 
        array("grade" => 1, "minSum" => 6, "maxSum" => 8, "textScore" => "Intermediate"), 

       /* ... */ 
       ); 


    for ($ruleIdx=0; $ruleIdx<count($rules); $ruleIdx++) { 

     $currentRule = $rules[$ruleIdx]; 

     if (($currentRule['grade'] == $grade) && 
      ((is_null($currentRule['minSum'])) || ($currentRule['minSum'] <= $sum)) && 
      ((is_null($currentRule['maxSum'])) || ($currentRule['maxSum'] >= $sum))) { 
      return $currentRule['textScore']; 
     } 
    } 

    // got to the end without finding a match - need to decide what to do 
} 

ルールには、オプションの最小値と最大値があります。それは一致を見つけるとすぐに停止するので、順序が重要です。一致するルールがないかどうかを判断する必要があります。ロジックを変更することなく、既存のルールを削除するか、既存のルールを変更するだけで済みます。あなたの例から

0

私は、次の

多次元配列を示唆していますが、それらの `13等級として4つのcategories`の説明を表示し、最初に配列

// Grade => [Text => [Min,Max]] 
$textScores = [ 
    1 => [ 
     'Beginning' => [0, 5], 
     'Intermediate' => [5, 8], 
     'Master'  => [8, 10] 
    ], 
    2 => [ 
     'Beginning' => [0, 7], 
     'Intermediate' => [7, 8], 
     'Master'  => [8, 10] 
    ], 
    3 => [ 
     'Beginning' => [0, 3], 
     'Intermediate' => [3, 6], 
     'Master'  => [6, 10] 
    ] 
]; 

// Random input to test 
$grade = rand(1, 3); 
$sumScore = rand(0, 10); 

foreach ($textScores[$grade] as $Text => $MinMax) { 

    if ($MinMax[0] <= $sumScore && $MinMax[1] >= $sumScore) { 
     $textScore = $Grade; 
     break; 
    } 
} 
+0

これも非常に便利です。私はこれを調べるかもしれないと思うので、それぞれの生のスコアとそのテキストスコアを書く必要はありません。 – Kayla

+0

私は実際にこのメソッドを使用しました。これは私のコードを大幅に削減します。私は実際にあなたの最小/最大メソッドを使用する代わりに合計値を持つ別の配列を作成し、ちょうど別のforeachループを追加しました。 – Kayla

+0

私はそのコードを見たいと思います、面白いようです。私は配列が大好きです:) –

関連する問題