【问题标题】:Trying to print average grade using mysql and php尝试使用 mysql 和 php 打印平均成绩
【发布时间】:2013-12-12 09:39:39
【问题描述】:

我试图从我表中的一个列的字母成绩中打印出平均成绩。它适用于前两个输入,但之后当我继续添加平均值不再正确时,我不确定发生了什么。

*我觉得这不是最干净的代码

$totalGrade =0;
    $result = mysqli_query($con,"SELECT id,grade FROM gpa");
while ($row = mysqli_fetch_array($result)) {

    if($row['grade'] == 'A') {
        $numberGrade = 4;
    $totalGrade = ($totalGrade + $numberGrade);
} if ($row['grade'] == 'A-') {
    $numberGrade = 3.67;
    $totalGrade = ($totalGrade + $numberGrade);
} if ($row['grade'] == 'B+') {
    $numberGrade = 3.33;    
    $totalGrade = ($totalGrade + $numberGrade);
} if ($row['grade'] == 'B') {
    $numberGrade = 3;    
    $totalGrade = ($totalGrade + $numberGrade);
} if ($row['grade'] == 'B-') {
    $numberGrade = 2.67;
    $totalGrade = ($totalGrade + $numberGrade);
} if ($row['grade'] == 'C+') {
    $numberGrade = 2.33;    
    $totalGrade = ($totalGrade + $numberGrade);                                                                                
} if ($row['grade'] == 'C')  {
    $numberGrade = 2;
    $totalGrade = ($totalGrade + $numberGrade);
} if ($row['grade'] == 'C-') {
    $numberGrade = 1.67; 
    $totalGrade = ($totalGrade + $numberGrade);                                                                                
} if ($row['grade'] == 'D')  {
    $numberGrade = 1;  
    $totalGrade = ($totalGrade + $numberGrade);                                                                         
} else {
    $numberGrade = 0;  
    $totalGrade = ($totalGrade + $numberGrade);                                                                         
}
$totalGrade = $totalGrade/$row['id'];
}

【问题讨论】:

  • 您可能想查看switch 声明...查看/管理会容易得多

标签: php mysql loops


【解决方案1】:

有两个问题:

$totalGrade = $totalGrade/$row['id']; 不应该在当前的循环内。将它移到您的 while 循环之外。

$totalGrade = $totalGrade/$row['id']; 除以行的 ID。您不能依赖于所代表的分数相加。

相反,将放在你的循环之前:

$count = 0;

然后,在你的循环中,输入:

$count++;

然后,最后,你的循环之外,放入:

$totalGrade = $totalGrade/$count;

最后,有一种更优雅(且更易于维护)的方法来执行此操作,即使用数组映射或类似方法。我强烈建议调查一下。

基本上,在循环之前,像这样设置一个数组:

$grade_values = array(  'A' => 4.0,
                        'A-'=> 3.67,
                        'B' => 3.0,
                        ...etc...
);

然后,你的整个函数可以如下所示:

while ($row = mysqli_fetch_array($result)) {
    $totalGrade+= ($grade_value[$row['grade']]);
    $count++;
}
$count = mysql_num_rows($result);
$totalGrade = $totalGrade/$count;

维护更简单。它只是代码的一小部分。而且看的更爽!

好的,finally finally,你不应该使用mysql。您应该使用 mysqli 或 PDO。 Mysql 已弃用,不安全等:PHP documentation on mysql

【讨论】:

    【解决方案2】:

    我想通过向您展示我喜欢的所有条件的替代方法来补充@cale_b 的答案。你可以用数组代替,看看

    <?php
    $totalGrade = 0;
    $result = mysqli_query($con, "SELECT id,grade FROM gpa");
    
    $grades = array(
        'A'  => 4,
        'A-' => 3.67,
        'B+' => 3.33,
        'B'  => 3,
        'B-' => 2.67,
        'C+' => 2.33,
        'C'  => 2,
        'C-' => 1.67,
        'D'  => 1
    );
    
    $totalGrade = 0;
    $numGrades  = 0;
    while($row = mysqli_fetch_array($result)) {
        $numberGrade = 0;
        $grade       = $row['grade'];
    
        if(isset($grades[$grade]))
            $numberGrade = $grades[$grade];
    
        $totalGrade = $totalGrade + $numberGrade;
        $numGrades++;
    }
    
    $totalGrade /= $numGrades;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 2019-08-25
      相关资源
      最近更新 更多