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

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

По сути, это лишь ещё упрощённая версия вот такого теста, понадобилось в работе :)

Разница в том, что в упрощённом коде есть всего один вид вопросов - выбор варианта ответа из нескольких предложенных. Весь тест по-прежнему хранится в массиве $test, только теперь там для единообразия вложенные данные (о вариантах ответа на вопрос и баллах за них) также оформлены в виде массивов. Везде по умолчанию выбран "пустой" вариант с обозначением "???", то есть, за вопросы, на которые не выбиралось никакого ответа, баллы не начисляются.

Полный исходник приложения приводится ниже, выполнить его можно, установив на своём компьютере локальный сервер и выполнив на нём код, сохранённый в папке сервера как файл типа .php. Разметка файла - HTML5, а не 4, как в исходном скрипте.

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>Очень простой тест (только выбор одного из вариантов)</title>
 </head>
<body>
<?php
 //Определение всего теста в массиве $test
 $test = array ( //'q'-вопрос,'a'-варианты ответа,'b'-баллы
  array(
   'q'=>'Вопрос 1', 
   'a'=>array('Ответ 1-1','Ответ 1-2'), 
   'b'=>array(1,0)
  ),
  array(
   'q'=>'Вопрос 2', 
   'a'=>array('Ответ 2-1','Ответ 2-2','Ответ 2-3'), 
   'b'=>array(0,0,1)
  )
 );
 //Обработка теста
 if (isset($_POST['action'])) { //Нажата кнопка - выводим результаты
  $cnt = 0; //количество набранных баллов
  $max = 0; //максимально возможный балл
  for ($i=0;$i<count($test);$i++) { //Цикл по вопросам теста
   $a = intval($_POST['a'.($i+1)]); //Номер выбранного варианта
   $max1  = max($test[$i]['b']); $max += $max1;
    //Ищем максимально возможное на тесте количество баллов
   if (empty($a) or $a<1 or $a>count($test[$i]['b'])) continue; 
    //Не учитываем неверные номера вариантов, если они были переданы
   $cnt += $test[$i]['b'][$a-1]; //Считаем общий балл за ответы
  }
  echo '<p>Ваши баллы: '.$cnt.' из '.$max.', '.round($cnt/$max*100,1).'%</p>'.
   '<p><a href="'.$_SERVER['HTTP_REFERER'].'">Ещё раз</a></p>'."\n";
 }
 else { //Иначе вывести форму
  echo '<form method="post">';
  for ($i=0;$i<count($test);$i++) { //Цикл по вопросам теста
   echo '<p>№'.($i+1).'. '.$test[$i]['q']. //Номер и текст вопроса
   ' <select name="a'.($i+1).'" size="1">'. //Добавляем тег списка
   ': <option value="0">???'."\n"; //Добавляем "пустой" вариант "???"
   for ($j=0; $j<count($test[$i]['a']); $j++) //Остальные варианты
    echo '<option value="'.($j+1).'">'.$test[$i]['a'][$j]."\n";
   echo '</select></p>'."\n"; //Закрываем вопрос
  }
  echo '<p><input type="submit" name="action" value="OK"></form></p>'."\n";
 }
?> 
</body></html>

Если нужно прочитать данные теста из текстового файла, сначала придумайте для него формат, например, такой:

Текст вопроса 1
Количество вариантов ответа N
Вариант 1-1
Баллы за вариант 1-1
...
Вариант 1-N
Баллы за вариант 1-N
[пустая строка]
Текст вопроса 2
...

Для данных из нашего исходника это будет

Вопрос 1
2
Ответ 1-1
1
Ответ 1-2
0

Вопрос 2
2
Ответ 2-1
0
Ответ 2-2
1

Затем прочитайте файл, заменив показанным ниже кодом "ручное" определение массива $test (предполагаем, что читается файл с именем test.txt из текущей папки скрипта, код не проверялся, но по виду верный :)

$test = array ();
 $data = @file('test.txt');
 if ($data === false) {
  echo '<p>Не могу прочитать файл test.txt'; return;
 }
 $i=$k=0;
 while (isset($data[$i])) {
  do {
   $str = trim($data[$i]); 
   if (!empty($str)) break; else $i++;
  } while (1);
  $test[$k] = array();
  $test[$k]['q'] = htmlspecialchars($data[$i++]);
  $answers=intval($data[$i++]);
  if ($answers<2 or $answers>10) {
   echo '<p>Неверное количество вариантов ответа '.$answers.
    ' в строке '.$i; return;
  }
  for ($j=0; $j<$answers; $j++) {
   $test[$k]['a'][$j] = htmlspecialchars($data[$i++]);
   $b = intval($data[$i++]);
   if ($b<0 or $b>10) {
    echo '<p>Неверное количество баллов '.$b.
    ' в строке '.$i; return;
   }
   $test[$k]['b'][$j] = $b;
  }
  $str = trim($data[$i++]); 
  if (!empty($str)) {
    echo '<p>Нет пустой строки после вопроса '.($k+1).
    ' в строке '.$i; return;
  }
  $k++;
 }

Так как скрипт в Юникоде (UTF-8), в этой же кодировке должен быть и текстовый файл с данными, используйте Notepad++, а не Блокнот Windows!

этот тест в работе
этот тест в работе

06.11.2017, 15:17 [2540 просмотров]


теги: учебное php форматы тест

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