更有效的执行多个IF的方法

时间:2010-02-03 09:29:58

标签: php performance

这只是一个简单的检查,看看要输出什么字母等级。有没有更快更有效的方法来实现目标?

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

7 个答案:

答案 0 :(得分:12)

这不是回答你的实际问题,但我认为你在这里犯了错误:

在使用PHP时,你真的不应该考虑效率,它不是一种专为速度而设计的语言,而是一种易于使用的语言。如果您的应用程序尚未完成并且您尚未验证此代码段会减慢整个应用程序(例如,使用xdebug的分析器),则更是如此。

答案 1 :(得分:3)

任何此类改进都将是微观优化。我认为你已经获得了效率和清晰度的最佳解决方案。

答案 2 :(得分:2)

我同意其他海报,你已经正确地做了。但是,在这种情况下,您可以尝试将$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声明。

答案 3 :(得分:1)

我确信有些奇怪的忍者可以做你正在做的事情,但你的肯定是最好的。这是最清晰的阅读,而且性能明智,它太快了无关紧要。

答案 4 :(得分:1)

就我个人而言,我认为我会为此目的使用具有多个回报的函数:

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

然而,如果一个函数中的多个返回是否正常,那么在SO上存在一些争论。你的选择。我认为这比抽出的if语句更清晰。

答案 5 :(得分:0)

我实际上并不知道这是什么效率,但我看到了这个问题,并希望以非嵌套if()样式解决它,因此更有知识的人可以比较它的相对效率。 Soooooo ......这是另一种方式:)

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

答案 6 :(得分:-3)

$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";
    }
}