Jump to content

Checkbox array in answer key array


PHPBear
Go to solution Solved by tryingtolearn,

Recommended Posts

I'm developing a series of database-driven quizzes and tests. Most of the answers will be multiple choice, but there will also be some fill-in-the-blank questions. What's causing me trouble is questions that ask users to choose several answers by selecting several checkboxes. There could be one or more such questions in each quiz, and the number of correct and wrong choices will vary.


The answer key below is tailored for a quiz with just one checkbox question, with six choices - three correct and three incorrect. The script awards partial scores for each correct choice and also deducts points for each wrong answer.


I'd like to change it so that there are no gray areas - a question is either right or wrong. In this particular example, a user has to choose all three correct answers and no correct answers. Any variation whatsoever results in a wrong answer (0% for that answer).


I would guess it should be as simple as coding it to say "a checkbox answer must be exactly identical to the array within in an array in the answer key." Unfortunately, I don't have a clue how to write that. ;)


Thanks for any tips.


if (isset($_POST)):

$totalCorrect = 0;
$answers = array(1 => 'A', 2 => 'banana', 3 => 'C', 4 => 'D', 5 => 'A', 6 => 'C', 7 => 'C', 8 => 'C', 9 => 'B', 10 => array('A','B','C'));

foreach ($answers as $num => $answer):

$question = 'q'.$num;

if(is_array($answer) && isset($_POST[$question])){
$ans_cnt = count($answer);
$ans_value = (1 / $ans_cnt);

$post_cnt = count($_POST[$question]);

//find matches between answer array and post array
$matches = array_intersect($answer,$_POST[$question]);
$good_answers = count($matches);
//Get bad answer count, which be be subtracted from overall score
$bad_answers = 0;
foreach($_POST[$question] as $post_answer):
if(!in_array($post_answer,$answer)):
$bad_answers++;
endif;
endforeach;
//Result of good answers minus bad answers
// $result = $good_answers - $bad_answers;

if($good_answers > $bad_answers){
$result = $good_answers - $bad_answers;
}else{
$result = 0;
}

if(($post_cnt != $ans_cnt) || ($post_cnt == $ans_cnt && $ans_cnt != count($matches))){
$result = $result * $ans_value;
$totalCorrect = $totalCorrect + $result;
}else{
$totalCorrect++;
}

}elseif(isset($_POST[$question]) && strtolower($_POST[$question]) === strtolower($answer)){
$totalCorrect++;
}
endforeach;

$pct = round( (($totalCorrect/count($answers)) * 100), 0);
echo $totalCorrect.' correct ('.$pct.'%)';
 
endif;

Link to comment
Share on other sites

You already count good and bad answers and then score them here:

if($good_answers > $bad_answers){
$result = $good_answers - $bad_answers;
}else{
$result = 0;
}

Why not just change the scoring to?

if($good_answers ==3 && $bad_answers==0){
$result = 1;
}else{
$result = 0;
}
  • Like 1
Link to comment
Share on other sites

 

You already count good and bad answers and then score them here:

if($good_answers > $bad_answers){
$result = $good_answers - $bad_answers;
}else{
$result = 0;
}

Why not just change the scoring to?

if($good_answers ==3 && $bad_answers==0){
$result = 1;
}else{
$result = 0;
}

That works great for this particular example. Thanks.

 

However, what happens if I there are TWO questions with multiple checkbox answers, one with three correct answers, the other with five?

 

That's why I'd like to take it one step further and "automate" it so that the script automatically handles all checkbox questions, regardless of the number of correct answers. So the code might look something like this:

if($good_answers ==[the total number of correct choices in a given question] && $bad_answers==0)

If it helps, here's the HTML for two questions - a multiple choice question and a checkbox question:

<li id="q9">
  <div class="Question">Scientists believe the universe is:</div>
  <div class="Answer">
    <label class="Wide" for="q9-A"><div class="Radio"><input type="radio" name="q9" id="q9-A" value="A" style="display: none;"> A. disappearing</div></label></div>
  <div class="Answer">
    <label class="Wide" for="q9-B"><div class="Radio"><input type="radio" name="q9" id="q9-B" value="B" style="display: none;"> B. expanding</div></label></div>
  <div class="Answer">
    <label class="Wide" for="q9-C"><div class="Radio"><input type="radio" name="q9" id="q9-C" value="C" style="display: none;"> C. contracting</div></label></div>
  <div class="Answer">
    <label class="Wide" for="q9-D"><div class="Radio"><input type="radio" name="q9" id="q9-D" value="D" style="display: none;"> D. becoming bipolar</div></label></div>
</li>
		
<li id="q10">
  <div class="Question">Check each item that can be found in our solar system.</div>
  <div class="Answer" style="margin-top: 5px; background: #000; color: #fff; text-align: center;">
    <label for="q10-A"><input type="checkbox" name="q10[]" id="q10-A" value="A">planet</label>
    <label for="q10-B"><input type="checkbox" name="q10[]" id="q10-B" value="B">asteroid</label>
    <label for="q10-C"><input type="checkbox" name="q10[]" id="q10-C" value="C">comet</label>
    <label for="q10-D"><input type="checkbox" name="q10[]" id="q10-D" value="D">black hole</label>
    <label for="q10-E"><input type="checkbox" name="q10[]" id="q10-E" value="E">neutrino star</label>
    <label for="q10-F"><input type="checkbox" name="q10[]" id="q10-F" value="F">quasar</label>
  </div>
</li>
Edited by PHPBear
Link to comment
Share on other sites

  • Solution

This is how I've handled this in the past.

Using your last example (Well the answers aren't correct its just a mix of different combinations)

 

just change your form element id's

 

You should be able to adjust the questions how you need from fill in the blank, multiple choice, and checkboxes.

Hope it helps

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset=utf-8>
        <title>test</title>
    </head>
    <body>
        <?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $qa = $_POST['q'];
    $correct = 0;
    $answers = array(1 => array('A','B'), 
                 2 => array('A','B','C'), 
                 3 => array('A'), 
                 4 => array('A','B','C','D'), 
                 5 => array('A','B'), 
                 6 => array('A','B'), 
                 7 => 'cat', 
                 8 => 'B', 
                 9 => 'C', 
                 10 => array('A','B'));
    $total = count($answers);
    foreach($answers as $k => $v){
        if(is_array($v)){
            if($qa[$k] === $answers[$k]){
                $correct++;
            }
        }else{
            if($qa[$k] === $answers[$k]){
                $correct++;
            }
        }
    }
    $grade= ($correct/count($answers))*100;
    echo"<p>Score $grade %</p>";
}
        ?>
        <form action="index.php" method="post">
            <ul>
            <li id="q1">
                <div class="Question">Check each item that can be found in our solar system.</div>
                <div class="Answer" style="margin-top: 5px; background: #000; color: #fff; text-align: center;">
                    <label for="q1-A"><input type="checkbox" name="q[1][]" id="q1-A" value="A" >planet</label>
                    <label for="q1-B"><input type="checkbox" name="q[1][]" id="q1-B" value="B" >asteroid</label>
                    <label for="q1-C"><input type="checkbox" name="q[1][]" id="q1-C" value="C" >comet</label>
                    <label for="q1-D"><input type="checkbox" name="q[1][]" id="q1-D" value="D" >black hole</label>
                    <label for="q1-E"><input type="checkbox" name="q[1][]" id="q1-E" value="E">neutrino star</label>
                    <label for="q1-F"><input type="checkbox" name="q[1][]" id="q1-F" value="F">quasar</label>
                </div>
            </li>
            
            <li id="q2">
                <div class="Question">Check each item that can be found in our solar system.</div>
                <div class="Answer" style="margin-top: 5px; background: #000; color: #fff; text-align: center;">
                    <label for="q2-A"><input type="checkbox" name="q[2][]" id="q2-A" value="A" >planet</label>
                    <label for="q2-B"><input type="checkbox" name="q[2][]" id="q2-B" value="B" >asteroid</label>
                    <label for="q2-C"><input type="checkbox" name="q[2][]" id="q2-C" value="C" >comet</label>
                    <label for="q2-D"><input type="checkbox" name="q[2][]" id="q2-D" value="D">black hole</label>
                    <label for="q2-E"><input type="checkbox" name="q[2][]" id="q2-E" value="E">neutrino star</label>
                    <label for="q2-F"><input type="checkbox" name="q[2][]" id="q2-F" value="F">quasar</label>
                </div>
            </li>
            
            <li id="q3">
                <div class="Question">Check each item that can be found in our solar system.</div>
                <div class="Answer" style="margin-top: 5px; background: #000; color: #fff; text-align: center;">
                    <label for="q3-A"><input type="checkbox" name="q[3][]" id="q3-A" value="A" >planet</label>
                    <label for="q3-B"><input type="checkbox" name="q[3][]" id="q3-B" value="B" >asteroid</label>
                    <label for="q3-C"><input type="checkbox" name="q[3][]" id="q3-C" value="C" >comet</label>
                    <label for="q3-D"><input type="checkbox" name="q[3][]" id="q3-D" value="D">black hole</label>
                    <label for="q3-E"><input type="checkbox" name="q[3][]" id="q3-E" value="E">neutrino star</label>
                    <label for="q3-F"><input type="checkbox" name="q[3][]" id="q3-F" value="F">quasar</label>
                </div>
            </li>
            
            <li id="q4">
                <div class="Question">Check each item that can be found in our solar system.</div>
                <div class="Answer" style="margin-top: 5px; background: #000; color: #fff; text-align: center;">
                    <label for="q4-A"><input type="checkbox" name="q[4][]" id="q4-A" value="A" >planet</label>
                    <label for="q4-B"><input type="checkbox" name="q[4][]" id="q4-B" value="B" >asteroid</label>
                    <label for="q4-C"><input type="checkbox" name="q[4][]" id="q4-C" value="C" >comet</label>
                    <label for="q4-D"><input type="checkbox" name="q[4][]" id="q4-D" value="D">black hole</label>
                    <label for="q4-E"><input type="checkbox" name="q[4][]" id="q4-E" value="E">neutrino star</label>
                    <label for="q4-F"><input type="checkbox" name="q[4][]" id="q4-F" value="F">quasar</label>
                </div>
            </li>
            
            <li id="q5">
                <div class="Question">Check each item that can be found in our solar system.</div>
                <div class="Answer" style="margin-top: 5px; background: #000; color: #fff; text-align: center;">
                    <label for="q5-A"><input type="checkbox" name="q[5][]" id="q5-A" value="A" >planet</label>
                    <label for="q5-B"><input type="checkbox" name="q[5][]" id="q5-B" value="B" >asteroid</label>
                    <label for="q5-C"><input type="checkbox" name="q[5][]" id="q5-C" value="C" >comet</label>
                    <label for="q5-D"><input type="checkbox" name="q[5][]" id="q5-D" value="D">black hole</label>
                    <label for="q5-E"><input type="checkbox" name="q[5][]" id="q5-E" value="E">neutrino star</label>
                    <label for="q5-F"><input type="checkbox" name="q[5][]" id="q5-F" value="F">quasar</label>
                </div>
            </li>
            
            <li id="q6">
                <div class="Question">Check each item that can be found in our solar system.</div>
                <div class="Answer" style="margin-top: 5px; background: #000; color: #fff; text-align: center;">
                    <label for="q6-A"><input type="checkbox" name="q[6][]" id="q6-A" value="A" >planet</label>
                    <label for="q6-B"><input type="checkbox" name="q[6][]" id="q6-B" value="B" >asteroid</label>
                    <label for="q6-C"><input type="checkbox" name="q[6][]" id="q6-C" value="C" >comet</label>
                    <label for="q6-D"><input type="checkbox" name="q[6][]" id="q6-D" value="D">black hole</label>
                    <label for="q6-E"><input type="checkbox" name="q[6][]" id="q6-E" value="E">neutrino star</label>
                    <label for="q6-F"><input type="checkbox" name="q[6][]" id="q6-F" value="F">quasar</label>
                </div>
            </li>
            
            <li id="q7">
                <div class="Question">Scientists believe the universe is:</div>
                <div class="Answer">
                    <label class="Wide" for="q7-A"><div class="Radio"><input type="text" name="q[7]" id="q7-A" value="" style="display: inline;"></div></label>
                </div>
                
            </li>
            
            <li id="q8">
                <div class="Question">Scientists believe the universe is:</div>
                <div class="Answer">
                    <label class="Wide" for="q8-A"><div class="Radio"><input type="radio" name="q[8]" id="q8-A" value="A" style="display: inline;"> A.disappearing</div></label>
                </div>
                <div class="Answer">
                    <label class="Wide" for="q8-B"><div class="Radio"><input type="radio" name="q[8]" id="q8-B" value="B" style="display: inline;" > B. expanding</div></label>
                </div>
                <div class="Answer">
                    <label class="Wide" for="q8-C"><div class="Radio"><input type="radio" name="q[8]" id="q8-C" value="C" style="display: inline;"> C. contracting</div></label>
                </div>
                <div class="Answer">
                    <label class="Wide" for="q8-D"><div class="Radio"><input type="radio" name="q[8]" id="q8-D" value="D" style="display: inline;"> D. becoming</div></label>
                </div>
            </li>
            
            <li id="q9">
                <div class="Question">Scientists believe the universe is:</div>
                <div class="Answer">
                    <label class="Wide" for="q9-A"><div class="Radio"><input type="radio" name="q[9]" id="q9-A" value="A" style="display: inline;"> A.disappearing</div></label>
                </div>
                <div class="Answer">
                    <label class="Wide" for="q9-B"><div class="Radio"><input type="radio" name="q[9]" id="q9-B" value="B" style="display: inline;" > B. expanding</div></label>
                </div>
                <div class="Answer">
                    <label class="Wide" for="q9-C"><div class="Radio"><input type="radio" name="q[9]" id="q9-C" value="C" style="display: inline;"> C. contracting</div></label>
                </div>
                <div class="Answer">
                    <label class="Wide" for="q9-D"><div class="Radio"><input type="radio" name="q[9]" id="q9-D" value="D" style="display: inline;"> D. becoming</div></label>
                </div>
            </li>
            
            <li id="q10">
                <div class="Question">Check each item that can be found in our solar system.</div>
                <div class="Answer" style="margin-top: 5px; background: #000; color: #fff; text-align: center;">
                    <label for="q10-A"><input type="checkbox" name="q[10][]" id="q10-A" value="A" >planet</label>
                    <label for="q10-B"><input type="checkbox" name="q[10][]" id="q10-B" value="B" >asteroid</label>
                    <label for="q10-C"><input type="checkbox" name="q[10][]" id="q10-C" value="C" >comet</label>
                    <label for="q10-D"><input type="checkbox" name="q[10][]" id="q10-D" value="D">black hole</label>
                    <label for="q10-E"><input type="checkbox" name="q[10][]" id="q10-E" value="E">neutrino star</label>
                    <label for="q10-F"><input type="checkbox" name="q[10][]" id="q10-F" value="F">quasar</label>
                </div>
            </li>
        </ul>
            <input type="submit" name="submit" value="submit" />
        </form>
    </body>
</html>
  • Like 1
Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.