БлогNot. Тест на PHP: можно ли ещё проще, чем проще :)

Тест на PHP: можно ли ещё проще, чем проще :)

"Очень простые тесты на PHP", в смысле простоты их программирования, в этом блоге уже есть, хотя по-настоящему просто - это когда листинг умещается на одном экране проектора :)

Чтобы так сделать, наверное, придётся отказаться от нескольких типов вопросов и ограничиться чем-то одним.

Вот пример для случая, когда в качестве ответов на вопросы выбираются флажки-checkbox'ы, то есть, выбор сводится к отметке верных или неверных утверждений из предложенных. Вопросы хранятся в массиве $questions, а ответы (нули и единицы, информация о состоянии очередного чекбокса при правильном ответе на вопрос) - в массиве $answers.

Дальше с помощью условного оператора программируем два состояния скрипта (вывод формы и вывод результатов) - и всё.

<?php 
$questions = array ('2*2=4','3-7=4','5+1=7','3*2=6');
$answers = array (1,0,0,1);
if (isset($_POST['result'])) { //Результаты
 $cnt = 0;
 foreach ($answers as $index=>$answer) {
  if (!isset($_POST['r'.$index])) $my_answer=0;
  else $my_answer=1; //checkbox не шлёт данных, если он не выбран
  if ($my_answer==$answer) $cnt++;
 }
 echo 'Верно: '.$cnt.' из '.count($answers).
  ' <a href="'.$_SERVER['HTTP_REFERER'].'">Ещё раз</a>';
} 
else { //Форма для заполнения
 echo '<form method="post">'."\n";
 foreach ($questions as $index=>$question) {
  $num = 'r'.$index;
  echo '<input type="checkbox" name="'.$num.'" id="'.$num.'" value="1">'.
   '<label for="'.$num.'">'.$question.'</label><br>'."\n";
 }
 echo '<input type="submit" name="result" value="ОК"></form>'."\n";
}
?>
скриншот мини-теста 1 в работе
скриншот мини-теста 1 в работе

С помощью меток <label> сделано так, что щёлкать можно по тексту вопроса, а не только по "квадратику" самого чекбокса.

Типовое обрамление HTML пропущено, но показанные коды вместе с тегом <?php ?> легко вставить, например, в этот шаблон вместо слов "Содержимое документа"

Если ответами будет ввод целых чисел в стандартные поля ввода текста, шаблон изменится не слишком сильно:

<?php
 $questions = array ('2+2=','3-7=','5+1=','3*3=');
 $answers = array(4,-4,6,9);
 if (isset($_POST['result'])) { //переданы результаты
  $cnt = 0;
  foreach ($answers as $index=>$answer) {
   if (isset($_POST['r'.$index])) $my_answer = intval(trim($_POST['r'.$index])); 
   else $my_answer = '';
   if ($my_answer == $answer) $cnt++;          
  }
  echo 'Верно: '.$cnt.' из '.count($answers).
   ' <a href="'.$_SERVER['HTTP_REFERER'].'">Ещё раз</a>';
 } 
 else { //вывести форму
  echo '<form method="post">'."\n";	 
  foreach ($questions as $index=>$question) 
   echo $question.' <input type="text" name="r'.
    $index.'" size="2" maxlength="2" value=""><br>'."\n";
  echo '<input type="submit" name="result" value="OK"></form>'."\n";	    
 }
?>

Теперь в массиве $answers хранятся правильные ответы в виде целых чисел, которые пользователь должен ввести в поля формы при ответе на вопросы теста:

скриншот мини-теста 2 в работе
скриншот мини-теста 2 в работе

Напоминаю, что выполнять это нужно на локальном сервере, а не из файловой системы. Проверял в XAMPP с текущей версией PHP 7.X и Windows 10.

Если придраться к тому, что информация о вопросе и ответе хранится в разных массивах, и не допускать, чтобы тексты вопросов служили атрибутами элементов формы (вдруг в них есть двойная кавычка или ещё что подобное), то, наверное, можно сделать так:

<?php 
$test = array (
 '2*2=4' => 1,'3-7=4' => 0,'5+1=7' => 0,'3*2=6' => 1
);
if (isset($_POST['result'])) {
 $cnt = $index = 0;
 foreach ($test as $question=>$answer) {
  if (!isset($_POST['r'.$index])) $my_answer=0;
  else $my_answer=1;
  if ($my_answer == $answer) $cnt++;
  $index++;
 }
 echo 'Верно: '.$cnt.' из '.count($test).
  ' <a href="'.$_SERVER['HTTP_REFERER'].'">Ещё раз</a>';
} 
else {
 echo '<form method="post">'."\n";
 $index = 0;
 foreach ($test as $question=>$answer) {
  $num = 'r'.$index;
  echo '<input type="checkbox" name="'.$num.'" id="'.$num.'" value="1">'.
   '<label for="'.$num.'">'.$question.'</label><br>'."\n";
  $index++;
 }
 echo '<input type="submit" name="result" value="ОК"></form>'."\n";
}
?>

И со вторым видом теста по аналогии.

25.09.2019, 10:54 [1317 просмотров]


теги: учебное программирование php тест

К этой статье пока нет комментариев, Ваш будет первым