Более эффективный способ выполнения нескольких IF - PullRequest
6 голосов
/ 03 февраля 2010

Это просто простая проверка, чтобы увидеть, какую буквенную оценку вывести.Есть ли более быстрый и эффективный способ достижения цели?

if ( $grade >= 90 ) {
        echo "A";
    } elseif ( $grade >= 80 ) {
        echo "B";
    } elseif ( $grade >= 70 ) {
        echo "C";
    } else {
        echo "Failed."
    }

Ответы [ 7 ]

12 голосов
/ 03 февраля 2010

Это не отвечает на ваш актуальный вопрос, но я думаю, что вы делаете ошибку здесь:

Вы действительно не должны думать об эффективности при использовании PHP, это не язык, который был разработан для скорости, а язык, который был разработан для простоты использования. Тем более, если ваше приложение еще не завершено и вы не убедились, что этот фрагмент кода замедляет работу всего приложения (например, с помощью профилировщика xdebug ).

3 голосов
/ 03 февраля 2010

Любые такие улучшения были бы микрооптимизациями. Я думаю, что у вас есть лучшее решение для эффективности и ясности.

2 голосов
/ 03 февраля 2010

Я согласен с другими авторами, что вы уже делаете это правильно.Однако в подобных ситуациях вы можете попытаться преобразовать $grade в значение, которое можно использовать в качестве индекса в ассоциативном массиве, мало чем отличаясь от того, что @ ghostdog74 пытался сделать выше.

$gradeindex = (int)$grade / 10; // 10 since we want 10-19 = 1, etc..
$gradenames = array('10' => 'A+', '9' => 'A', '8' => B, ..... );

Однакопоскольку многие из них идентичны, я бы, вероятно, использовал switch()

$gradeindex = (int)$grade / 10; // 10 since we want 10-19 = 1, etc..
switch ($gradeindex) {
  case 10:
  case 9:
    $gradename = 'A';
    break;
  case 8:
    $gradename = 'B';
    break;
  case 7:
    $gradename = 'C';
    break;
  default:
    $gradename = 'Failed';
}
echo $gradename;

Но, как уже говорилось, вы в основном лучше с вашим текущим утверждением if.

1 голос
/ 03 февраля 2010

Лично я думаю, что для этой цели я бы использовал функцию с множественными возвратами:

function intGradeToStrGrade($grade) {
    if ($grade >= 90) return "A";
    if ($grade >= 80) return "B";
    ...
}

Однако здесь были некоторые споры о SO, если множественные возвраты в одной функции в порядке или нет.Твой выбор.Я думаю, что это намного чище, чем затянувшееся заявление if.

1 голос
/ 03 февраля 2010

Я уверен, что есть странные способы ниндзя делать то, что вы делаете, но ваш, безусловно, лучшийЕго легче читать, а с точки зрения производительности - слишком быстро.

0 голосов
/ 18 ноября 2016

Я на самом деле не знаю, какова эффективность этого, но я видел эту проблему и хотел решить ее в стиле не-вложенного-if (), чтобы более осведомленные люди могли сравнить ее относительную эффективность.Оооооо ... Вот и альтернативный способ сделать это:)

function GetLetterForPercentGrade($grade)
{
    $letter= chr(($grade >59) ? (10-floor($grade /10))+64 : 'F');
    $sign = chr(abs((ceil(((($grade %10)*10)+1)/34)*34)-69)+10);
    return $letter.$sign;
}
0 голосов
/ 03 февраля 2010
$grade=87;
$grades=array("A"=>range(95,100),"B"=>range(80,94),"C"=>range(70,79),"Failed"=>range(0,69));
foreach($grades as $g=>$v){
    if ( in_array($grade,$v) ){
        print $g."\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...