Тест на 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 [2621 просмотр]