2015-03-02 3 views
1

Я тестирую викторину с десятью вопросами. Все они имеют множественный выбор, за исключением второго (заполняющего пробел) и последнего, что требует от пользователя выбора трех из шести флажков.Критерий подсчета очков не работает правильно

Это ключевой ответ и забил сценарий:

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
$correct = 0; 
$answers = array(1 => array('A'), 
      2 => array('Mars'), 
      3 => array('C'), 
      4 => array('D'), 
      5 => array('A'), 
      6 => array('C'), 
      7 => 'C', 
      8 => 'C', 
      9 => 'B', 
      10 => array('A','B','C')); 
$total = count($answers); 

foreach($answers as $num => $answer){ 
    $qa = $_POST['q'.$num.'']; 

if(is_array($answer)){ 
    if(array_diff($qa, $answer) == array()){ 
     $correct++; 
    } 
} else if($qa === $answer){ 
    $correct++; 
} 

$grade= ($correct/count($answers))*100; 
} 
} 
echo '<div style="background: #ff0;">Score '.$grade.'%</div>'; 
echo '<br>var_dump: '; 
var_dump($_POST); 

Если я получаю все десять вопросов правильно, он отображает правильный массив (ниже), но я только получить оценку 70% вместо 100% , Если я получу первые два вопроса неправильно, но все остальные верны, я получаю 50% вместо 80%.

Может ли кто-нибудь увидеть проблему с моим скриптом подсчета очков, или вы считаете, что проблема кроется в другом месте моего кода викторины?

var_dump: array(12) { ["q1"]=> array(1) { [0]=> string(1) "A" } ["q2"]=> array(1) { [0]=> string(7) "Mars" } ["q3"]=> array(1) { [0]=> string(1) "C" } ["q4"]=> array(1) { [0]=> string(1) "D" } ["q5"]=> array(1) { [0]=> string(1) "A" } ["q6"]=> array(1) { [0]=> string(1) "C" } ["q7"]=> array(1) { [0]=> string(1) "C" } ["q8"]=> array(1) { [0]=> string(1) "C" } ["q9"]=> array(1) { [0]=> string(1) "B" } ["q10"]=> array(3) { [0]=> string(1) "A" [1]=> string(1) "B" [2]=> string(1) "C" } ["PreviousURL"]=> string(25) "http://g1/test/gw-intro" ["user_token"]=> string(13) "54f3d1ac48555" } 
+0

В '$ answers', элементы 7, 8 и 9 являются отдельные элементы, в то время как в вашем' $ _POST' соответствующие элементы массивов. Это объясняет 30% -ную разницу в подсчете очков. – cpilko

+0

Yikes, я не знаю, как я это сделал. Я исправил его, но оценка все еще по карте; если я получу первые четыре вопроса правильно, теперь я получаю оценку 100%. Возможно, мне придется отображать только определенные типы вопросов (например, множественный выбор) и посмотреть, могу ли я изолировать проблему. –

+0

Похоже, оценка основана на количестве ответов. Поэтому, если вы отвечаете только на один вопрос, и вы понимаете это правильно, вы получаете 1 из 1 правильно = 100%. Каждый вопрос, на который не ответил, должен вычесть 10% от оценки. –

ответ

0

Извините, это был хромой вопрос. Я проверил, что скрипт подсчета работает. Единственная проблема заключается в том, что если вы не отвечаете на конкретный вопрос, это не считается неправильным. Поэтому, если вы просто ответите на один вопрос, и вы поняли это правильно, это 1 из 1 или 100%, когда он должен быть 10%.

1

Надеюсь, это ответит на ваш вопрос - он работал в случайных испытаниях, которые я делал. Сообщите мне, если он не работает, как вам хотелось бы, и, пожалуйста, предоставьте более подробную информацию о том, почему это не так.

<?php 
$correct = $answered = 0; //Correct Total. 
$answers = array(1 => array('A'), 
     2 => array('Mars'), 
     3 => array('C'), 
     4 => array('D'), 
     5 => array('A'), 
     6 => array('C'), 
     7 => 'C', 
     8 => 'C', 
     9 => 'B', 
     10 => array('A','B','C')); 
$_POST = [ 
    'q1'=>['A'], 
    'q2'=>['Mars'], 
    'q3'=>['C'], 
    'q4'=>['D'], 
    'q5'=>['A'], 
    'q6'=>['C'], 
    'q7'=>'C', 
    'q8'=>'C' 

]; //I did this to run the algorithm without needing to make up a form. 
foreach($answers as $key => $values){ 
    if(!key_exists('q'.$key, $_POST)) //Key does not exist in the POST data sent by the browser, answer is therefore wrong. 
     $answered++; //Increase the "answered" count, but do not increase the correct count 
    else{ 
     $answer = $_POST['q'.$key]; 
     if($answer === $values){ 
      //If the answer is exactly equal to the value in the answer array, it is correct. 
      //I'm assuming you format the answers as you need. 

      $correct++; 
      $answered++; 
     }else{ 
      $answered++; 
     } 
    } 

} 
echo "Your Score is: {$correct}/{$answered}, or ". (($correct/$answered)*100)."%"; 

?>

Смежные вопросы