PHP Расчет вопросов викторины Rad ios и флажки - PullRequest
2 голосов
/ 17 июня 2020

У меня есть тест html, ответы указаны в формате переключателя и флажка.

Пользователи должны ответить на все части вопроса правильно, чтобы получить полные оценки, разделенные баллы не начисляются.

В моей викторине 25 вопросов.

Упрощенная версия html викторины ниже (показывает всего 4 вопроса);

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

// q2 answer is value 3
<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">

// q3 answer is value 3
<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 AND 2 (both correct answers need to be selected)
<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">
// etc

Мне нужно сравнить значения, представленные в викторине, с массивом заранее определенных правильных ответов.

Код PHP, который я должен проверить, приведен ниже;

$total = '0';

// if it is a multiple answer question, then the answer is an array of the correct values
// 'question number' => solution
$solutions = [
  '1-1' => 1, 
  '1-2' => 3, 
  '1-3' => 3, 
  '1-4' => [1,2],
  '1-5' => 3,
  '1-6' => [1,4,6],
  '1-7' => 2,
  '1-8' => [1,2],
  '1-9' => 2,
  '1-10' => 1,
  '1-11' => 4,
  '1-12' => 3,
  '1-13' => [2,4],
  '1-14' => 2,
  '1-15' => 1,
  '1-16' => 1,
  '1-17' => [1,2],
  '1-18' => 2,
  '1-19' => 2,
  '1-20' => 1,
  '1-21' => 3,
  '1-22' => 2,
  '1-23' => 1,
  '1-24' => 3,
  '1-25' => 2
];

// The loop goes through the solutions and compares the answer against the expected solution. 
// If the answer is not present, the ?? null sets it,
foreach ( $solutions as $question => $solution ) {
    $userAnswer = $_POST['form'][$question] ?? null;
    if ( is_array($solution) ){
        $correct = array_intersect($solution, $userAnswer);
        $total += (count($solution) == count($correct));
    }
    else    {
        $total += ($userAnswer == $solution);
    }
}

$marksPerAnswer = 5;
$total = $total * $marksPerAnswer;
$_POST['form']['total'] = $total;
var_dump($_POST);

Результаты var_dump($_POST) равны;

array (
  'form' => 
  array (
    '1-1' => '1',
    '1-2' => '3',
    '1-3' => '3',
    '1-4' => 
    array (
      0 => '1',
      1 => '2',
    ),
    '1-5' => 
    array (
      0 => '3',
    ),
    '1-6' => 
    array (
      0 => '1',
      1 => '4',
      2 => '6',
    ),
    '1-7' => 
    array (
      0 => '2',
    ),
    '1-8' => 
    array (
      0 => '1',
      1 => '2',
    ),
    '1-9' => 
    array (
      0 => '2',
    ),
    '1-10' => 
    array (
      0 => '1',
    ),
    '1-11' => 
    array (
      0 => '1',
    ),
    '1-12' => 
    array (
      0 => '3',
    ),
    '1-13' => 
    array (
      0 => '1',
      1 => '3',
    ),
    '1-14' => 
    array (
      0 => '2',
    ),
    '1-15' => 
    array (
      0 => '1',
    ),
    '1-16' => 
    array (
      0 => '1',
    ),
    '1-17' => 
    array (
      0 => '2',
      1 => '3',
    ),
    '1-18' => 
    array (
      0 => '2',
    ),
    '1-19' => 
    array (
      0 => '2',
    ),
    '1-20' => 
    array (
      0 => '2',
    ),
    '1-21' => 
    array (
      0 => '2',
    ),
    '1-22' => 
    array (
      0 => '3',
    ),
    '1-23' => 
    array (
      0 => '3',
    ),
    '1-24' => 
    array (
      0 => '3',
    ),
    '1-25' => 
    array (
      0 => '2',
    ),
    'total' => 30,
  ),
)

Я правильно ответил на первые десять вопросов (см. Мои ответы на массивы соответствуют решениям массива от 1-1 до 1-10), однако всего 30, я должен был набрать не менее 50 за первые десять правильных ответов ?

Похоже, что сценарий не считает вопросы с множественными ответами, такие как числа 4, 6 и 8. Я не знаю почему?

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

1 Ответ

1 голос
/ 18 июня 2020

Похоже, что есть некоторые проблемы с множественным выбором вещей или нет, это решение преобразует все в массивы, а затем проверяет, совпадает ли ответ с решением ...

$ total = 0;

foreach ( $solutions as $question => $solution ) {
    $userAnswer = $_POST['form'][$question] ?? null;
    $solution = is_array($solution) ? $solution : [$solution];
    $userAnswer = is_array($userAnswer) ? $userAnswer : [$userAnswer];
    $total += ($userAnswer == $solution);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...