0

2つのアレイがあります。$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問題は、次の基準を使用して、アレイ内の最小および2番目に小さいグレードをアップグレードしたいことです。

  1. アップスケーリングは、最低グレードから次に高いグレードへ、つまりBからA、CからBなどに行われます。

  2. グレードが同点の場合、最高点のグレードがアップグレードされます。

例:に
しましょ$marksarray(25,43,36,16,28)。したがって、として取得$gradesarray("C","A","B","D","C")ます。$upgraded_grades =array("C","A","B","C","B")つまり、Dグレード(最小グレード)がアップグレードされ、Cグレード(2番目に小さいグレードですが最大マーク付き)もアップグレードされます。

PHPでそれを行うにはどうすればよいですか?

4

2 に答える 2

2

連想配列を使用できます。これが方法の1つです:

編集済み

//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 に答える