2

PHP を使用してクイズを採点したいと考えています。提出すると、一連の回答が得られるクイズがあります。それらはすべて真/偽であるため、配列は次のようになります

array([0] => T, [1] => F, [2] => F)

そして、次のような回答キーがあります

array([0] => T, [1] => F, [2] => T)

正解率を計算するだけでなく、見逃した問題の数が 20% 未満の場合にのみ、見逃した問題の正解を表示できるように、各回答を確認する必要があります。

だから私の質問は、それぞれを通過するためにある種の foreach ループを行うべきか、それともある種の配列比較関数を使用する方が整頓されているかということです。

4

3 に答える 3

3

使用foreach():

$answer   = array(true, true, false, true, false);
$expected = array(true, true, true,  true, false);
$error    = array();

foreach ($answer as $k => $v) {
  if ($v !== $expected[$k])
    $error[$k] = $v;
}

// Display the correct answer if number of mistakes is <= 20%
if (floatval(count($error) / count($expected)) <= .2) {
  $correct = array_intersect_key($expected, $error);
}
于 2012-06-01T17:22:42.753 に答える
0

開始点としてgrading-arrayを取ります。(すべての質問に対して)すべてのキーが含まれている必要があるため、それらを使用して、submission-arrayで欠落しているキーを検出し、すべての回答見つけることができます。レポートを手動で計算する場合の例を次に示します。

$submission = array(1 => true, 3 => false, 4 => true, 100 => true);
$grading = array(0 => true, 1 => true, 2 => true, 3 => true, 4 => true);


//gather data
$answered = array();
$missing = array();
$correct = array();
$wrong = array();
foreach ($grading as $key => $answer) {
    if(array_key_exists($key, $submission)) {
        array_push($answered, $key);
        if ($submission[$key] === $answer)
            array_push($correct, $key);
        else
            array_push($wrong, $key);
    }
    else
        array_push($missing, $key);
}


//print report
echo "correct\n";
print_r($correct);
echo "\n\n";

echo "wrong\n";
print_r($wrong);
echo "\n\n";

echo "missing\n";
print_r($missing);
echo "\n\n";

echo "% answered\n";
echo 100*(count($answered)/count($grading));
echo "\n\n";

echo "% correct (of all questions)\n";
echo 100*(count($correct)/count($grading));
echo "\n\n";

echo "% correct (of all answered)\n";
echo 100*(count($correct)/count($answered));
echo "\n\n";

echo "% wrong (of all questions)\n";
echo 100*(count($wrong)/count($grading));
echo "\n\n";

echo "% wrong (of all answered)\n";
echo 100*(count($wrong)/count($answered));
于 2012-06-01T14:40:59.333 に答える
0

foreach ループを使用すると、より詳細に制御できます。配列内の等しい値を合計質問数で割ることにより、正しい % を決定できます。

于 2012-06-01T14:19:49.547 に答える