在PHP中比较数组中的值的最有效方法

在PHP中比较数组中的值的最有效方法,php,arrays,comparison,Php,Arrays,Comparison,我想用PHP给测验打分。我有一个测验,提交后会给出一系列答案。它们都是真/假,所以数组类似于 array([0] => T, [1] => F, [2] => F) 然后我有一个答案键,比如 array([0] => T, [1] => F, [2] => T) 我需要检查每个答案,这样我不仅可以计算正确率,而且还可以显示遗漏问题的正确答案,如果且仅当遗漏问题的数量少于20% 所以我的问题是,我应该做一些foreach循环来遍历每一个循环,还是使用某种数组

我想用PHP给测验打分。我有一个测验,提交后会给出一系列答案。它们都是真/假,所以数组类似于

array([0] => T, [1] => F, [2] => F)
然后我有一个答案键,比如

array([0] => T, [1] => F, [2] => T)
我需要检查每个答案,这样我不仅可以计算正确率,而且还可以显示遗漏问题的正确答案,如果且仅当遗漏问题的数量少于20%


所以我的问题是,我应该做一些foreach循环来遍历每一个循环,还是使用某种数组比较函数更整洁,如果是这样,哪一个?

对于foreach循环,您将拥有更多的控制。通过将数组中的相等值除以问题总数,可以确定正确的百分比。

以评分数组为起点。 因为它应该包含所有的密钥(对于所有问题),所以您可以使用它们来检测提交数组中缺少的密钥并找到所有答案。 如果要手动计算报告,以下是一个示例:

$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));
使用
foreach()

$answer=array(真、真、假、真、假);
$expected=数组(真、真、真、真、假);
$error=array();
foreach($k=>v){
如果($v!==$expected[$k])
$error[$k]=$v;
}
//如果错误数为,则显示正确答案
$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);
}