1

これは速いものです。ルールをループせずに、指定された値を事前設定されたルールの多次元配列と比較する方法はありますか?

例を挙げましょう。生徒を 1 から 10 まで評価しているとしましょう。そして、いくつかの言葉で成績評価を割り当てたいとします。したがって、マークの範囲とそれらが表すものがあります。たとえば、次のようになります。

$evaluation = array(
    array('from' => 1, 'to' => 3, 'comment' => 'Stop watching TV'),
    array('from' => 4, 'to' => 6, 'comment' => 'Keep trying'),
    array('from' => 7, 'to' => 8, 'comment' => 'Almost there'),
    array('from' => 9, 'to' => 10, 'comment' => 'EMC2')
);

生徒が 8 だったので、次のようにします。

$grade = 8;
foreach($evaluations as $evaluation) {
    if($grade >= $evaluation['from'] && $grade <= $evaluation['to']) {
        echo $evaluation['comment'];
    }
}

私は大丈夫だと思います。しかし、これを行うためのよりきちんとした方法はありますか? おそらく、一連のルールをループするよりも高速な組み込みの PHP 関数でしょうか?

ありがとう。

4

2 に答える 2

2

switch ステートメントの方がわずかに高速ですが、4 要素の配列を扱っているため、ほとんど何でも実行できます。

ステートメントを使用してループをアンロールすると、ループ内switchで大なり比較と小なり比較を行う必要があるため、評価する必要がある式の数を減らすことができます。を使用するswitchと、必要な比較は 1 つだけです。

array_filterやのような他の PHP 関数がありarray_reduce、正しいコールバック関数を定義すると同じ結果になる可能性がありますが、現在持っているものは他のものと同じくらい良いかもしれません。

于 2013-03-07T18:02:42.263 に答える
1

配列について少し考えすぎていると思います。各範囲の最大値でキー入力できます。データが少し少なく、評価も少なくなりますが、正直なところ、マイクロ最適化のようです。

$evaluation = array(
    3 => 'Stop watching TV',
    6 => 'Keep trying',
    8 => 'Almost there',
    10 => 'EMC2'
);

$grade = 8;
foreach ($evaluation as $limit => $comment) {
    if ($limit < $grade) continue;
    break;
}
echo $comment;
于 2013-03-07T18:22:14.507 に答える