PHP测验广播和复选框计算

问题描述 投票:1回答:1

我正在用PHP设计一个简单的测验,并想知道我是否在继续之前以正确的方式来处理它。

测验将包含约25个问题,包括单选按钮和复选框的混合。想法是计算总数,并在提交测验时将其显示给用户。

到目前为止,我只有四个问题。问题1-3是单选按钮,最多可以选择一个。问题4是一个复选框,最多允许两个选择,每个正确选择的价值为0.5

这是我的html代码的摘要(已删除问题和答案文本)。

HTML

// q1 answer is value 2
<input type="radio" name="form[1-1]" value="1">
<input type="radio" name="form[1-1]" value="2">
<input type="radio" name="form[1-1]" value="3">

// q2 answer is value 1
<input type="radio" name="form[1-2]" value="1">
<input type="radio" name="form[1-2]" value="2">
<input type="radio" name="form[1-2]" value="3">

// q1 answer is value 2
<input type="radio" name="form[1-3]" value="1">
<input type="radio" name="form[1-3]" value="2">
<input type="radio" name="form[1-3]" value="3">

// q4 answer is value 1 or 3. 0.5 points each
<input type="checkbox" name="form[1-4][]" value="1">
<input type="checkbox" name="form[1-4][]" value="2">
<input type="checkbox" name="form[1-4][]" value="3">
<input type="checkbox" name="form[1-4][]" value="4">

下面的PHP代码有效,是正确的方法还是有更有效的方法?特别是与复选框问题4有关。

PHP

$total = array();

$total = '0';

$q1 = $_POST['form']['1-1'];
$q2 = $_POST['form']['1-2'];
$q3 = $_POST['form']['1-3'];
$q4 = $_POST['form']['1-4'];

// answer with value 2 is correct
if ($q1 == '2' ) {
    $total++;
};
// answer with value 1 is correct
if ($q2 == '1' ) {
    $total++;
};
// answer with value 2 is correct
if ($q3 == '2' ) {
    $total++;
};
// answer with value 1 is correct
if ($q4[0] == '1' ) {
    $total = $total + 0.5;
};
// answer with value 3 is correct
if ($q4[1] == '3' ) {
    $total = $total + 0.5;
};

// send $total to database here

我不想使用JS / Jquery,我想使用PHP方法。

php html loops if-statement post
1个回答
0
投票

这是一个更加动态的版本,它也很适合从数据库中加载。

解决方案数组具有问题和答案的列表,如果它是一个多答案问题,则答案是正确值的数组。

循环遍历所有解决方案,并将答案与预期解决方案进行比较。如果不存在答案,则?? null对其进行设置,但其结果不匹配。

$solutions = ['1-1' => 2, '1-2' => 1, '1-3' => 2, '1-4' => [1,3]];

foreach ( $solutions as $question => $solution ) {
    $userAnswer = $_POST['form'][$question] ?? null;
    if ( is_array($solution) ){
        $marksPerAnswer = 1/count($solution);
        $correct = array_intersect($solution, $userAnswer);
        $total += $marksPerAnswer * count($correct);
    }
    else    {
        $total += ($userAnswer == $solution);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.