0

我有两个数组;$marks$grades$marks包含学生打分的分数,$grades通过$marks以下函数循环获得。

 function convertMarkToGrade($mark)
    {
        if($mark<21)
            return "D";
        else if($mark<33)
            return "C";
        else if($mark<41)
            return "B";
        else if($mark<=50)
            return "A";
    }

问题是我想$grades使用以下标准升级阵列中最小和第二小的等级

  1. 升级是从最低等级到下一个更高等级,依此类推,即 B 到 A,C 到 B 等

  2. 在成绩并列的情况下,分数最高的成绩将被升级。

例如:
$marksarray(25,43,36,16,28)所以我们$grades得到array("C","A","B","D","C"). 我想生成一个,$upgraded_grades =array("C","A","B","C","B")即 D 级(最小的等级)被升级,C 级(第二小的等级但最高分数)也被升级。

我怎样才能在php中做到这一点?

4

2 回答 2

2

您可以使用关联数组。这是其中一种方法:

编辑

//create associative array that has values as array of marks
$grades_arr = array("D" => array(), "C" => array(), "B" => array(), "A" => array() );

for($i = 0;$i < count($grades);$i++)
    array_push($grades_arr[$grades[$i]], $marks[$i]);

$loop = 0;
foreach($grades_arr as $key => &$value){
    if(empty($value))
        continue;

    if($loop == 2)
        break; //break after two upgrades
    else{
        $max = max($value);
        //unset the variable
        $value = array_diff($value, array($max));
        $value = array_values($value); 
        //push it into next higher grade
        array_push($grades_arr[chr(ord($key)-1)], $max);
        $loop++;
    }
}

print_r($grades_arr);
于 2012-04-29T17:03:35.853 回答
0

如果我理解正确,你需要这个:

    $letterMark = ....; // "A","B","C" or "D"

    /* decrese number, that is increse letter by one
       but make sure it does not exceed 'A' mark 
    */
    $ordedMark = max(ord($letterMark)- 1, ord('A')); 
    $upscaledMark = chr($ordedMark);

    return $upscaledMark;

我在这里将这个片段包装成函数:http: //codepad.viper-7.com/i9Rtgi

于 2012-04-29T11:57:07.160 回答