за основу взял QuizML, скачал с сайта исходники .С XML вроде разобрался, а вот с обработкой массива в цикле никак не получается. Как устроен файл "result.php"? по готовому примеру сайта "http://www.4stud.info/controls" Каким образом он формирует в цикле правильные ответы на вопросы. Пожалуйста покажите пример с описанием, очень прошу.
Вот пример файла result.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=Windows-1251" >
<title>Результаты тестирования</title>
<link href="tests.css" rel="stylesheet" type="text/css" media="all">
</head>
<body>
<div id="main">
<?php
/*
Пример обработки результатов тестирования Вы можете посмотреть на сайте http://www.4stud.info/controls/
*/
echo "<h1>Результаты тестирования</h1><p>Ответы, полученные со страницы опросника. Теперь эти ответы нужно разобрать, проверить и оценить в соответствии с выбранной методикой тестирования:</p><p style='margin-left: 30px;'>";
var_dump($_POST);
echo "<p>Пример обработки результатов тестирования Вы можете посмотреть на сайте <a href='http://www.4stud.info/controls/ '><b>http://www.4stud.info/</b></a></p>";
echo "<p>Обновления этого скрипта и другие примеры использования QuizML - на основном сайте проекта: <a href='http://quizml.webservis.ru/'><b>http://quizml.webservis.ru/</b& gt;</a></p>";
?>
<p
class='footer'><a href='http://quizml.webservis.ru/'>QuizML</a>, 2010</p>
</div>
</body>
</html>
Спустя 14 часов, 4 минуты, 40 секунд (4.02.2012 - 11:18) Антон Котов написал(а):
Друзья программисты!Неужели никто не поможет???
Спустя 7 часов, 45 минут, 48 секунд (4.02.2012 - 19:04) wplounge написал(а):
Как-то вот так (CSS я убрал, чтоб не занимал место):
Хотя, конечно, передача из формы таких полей как qid1, qid2, qid3 ... и т.д. и присвоение им значений 1, 2, 3... соответсвенно - по моему не очень умно, так что тот, кто делал эту форму задал дополнительную работу.
И еще, оценки по вопросам, возможно, проставляются не совсем правильно, я не сильно разбирался.
<?php
error_reporting(E_ALL ^ E_NOTICE);
include_once("f.php");
$file = "example.xml";//$_SESSION["TEST_FILE"];
$test = load_xml($file) or die ("<p>ERROR LOADING $file</p>");
$title = $test->title;
$comment = $test->comment;
$time = 0;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" >
<title>Результаты тестирования</title>
<link href="tests.css" rel="stylesheet" type="text/css" media="all">
<style>здесь была таблица стилей</style>
</head>
<body>
<div id="main">
<h1>Результаты тестирования</h1>
<p>Ответы, полученные со страницы опросника. Теперь эти ответы нужно разобрать, проверить и оценить в соответствии с выбранной методикой тестирования:</p>
<p style='margin-left: 30px;'>
<?php
/*
Обработка результатов тестирования
*/
// Переменные для подсчета правильных, частично правильных и неправильных ответов
$right_answers = 0;
$part_right_answers = 0;
$wrong_answers = 0;
// Массив с развернутыми сведениями
$details = array();
// Внесение в массив данных из файла xml
foreach($test->question as $q){
$qid = (int)$q[qid];
$qtype = (string)$q[type];
$text = (string)$q->text;
$answer = (string)$q->answer;
$details[$qid]['type'] = $qtype;
$details[$qid]['text'] = $text;
$details[$qid]['answer'] = $answer;
if($qtype == 'checkbox' || $qtype == 'radio'){
foreach($q->choice as $c){
$caid = (int)$c[aid];
$details[$qid]['choices'][$caid] = (string)$c;
}
}
}
/*
Прием ответов пользователя
*/
// Номер вопроса
$qnum;
// Прием ответов из $_POST
foreach($_POST as $key => $answer){
if(substr($key, 0, 3) == 'qid'){
$qnum = (int)$answer;
continue;
}
// Вносим ответ пользователя в массив с развернутыми данными
if($details[$qnum]['type'] == 'checkbox'){
if(substr($key, 0, 3) == 'q'. $qnum . 'a'){
$details[$qnum]['useranswer'][] = $answer;
}
}
else {
$details[$qnum]['useranswer'] = $answer;
}
}
/*
Проверка правильности ответов
*/
foreach($details as $num => $det){
if((string) $det['answer'] === (string) $det['useranswer']){
// Если ответ совпадает:
$score = 5;
$right_answers += 1;
}
//Если ответ не совпадает
else {
// Если вопрос подразумевает множество ответов:
if(is_array($det['useranswer'])){
// Перевод правильных ответов в массив
$rightans = explode(',', $det['answer']);
// Общее кол-во правильных ответов
$rqt = count($rightans);
// Общее кол-во ответов пользователя
$uqt = count($det['useranswer']);
// Сравнение ответов пользователя с правильными ответами
foreach($det['useranswer'] as $ua){
if(in_array($ua, $rightans)){
$a += 1;
}
else {
$b += 1;
}
}
if($b > 0) {
// Если есть неправильные ответы:
// Кол-во ответов всего
$allqt = count($det['choices']);
// Отношение кол-ва прав.ответов пользователя ко всем правильным ответам
$r = $a / $rqt;
// Отношение кол-ва непр. ответов пользователя ко всем ответам
$w = $b / $allqt;
// Оценка
$score = ($r - $w) * 5;
if($score < 0)
$score = 0;
$part_right_answers += 1;
}
elseif($a < $rqt){
// Если кол-во правильных ответов меньше чем нужно:
// Оценка
$score = ($a / $rqt) * 5;
$part_right_answers += 1;
}
else {
// Оценка
$score = 5;
$right_answers += 1;
}
}
else {
// Если вопрос подразумевает один ответ:
$score = 0;
$wrong_answers += 1;
}
}
// Вносим оценку в массив с развернутыми данными
$details[$num]['score'] = $score;
}
// Количество вопросов в тесте
$qcount = count($details);
/*
Вывод результатов тестирования
*/
?>
<ul>
<li>
Правильные ответы: <?php echo $right_answers; ?>
(<?php echo ($right_answers / $qcount) * 100;?> %)
</li>
<li>
Частично правильные ответы: <?php echo $part_right_answers; ?>
(<?php echo ($part_right_answers / $qcount) * 100;?> %)
</li>
<li>
Неправильные ответы: <?php echo $wrong_answers; ?>
(<?php echo ($wrong_answers / $qcount) * 100;?> %)
</li>
</ul>
<table>
<tr>
<th>№ В</th>
<th>Вопрос</th>
<th>Ваш ответ</th>
<th>Правильный ответ</th>
<th>Итог</th>
</tr>
<?php foreach ($details as $num => $row): ?>
<tr>
<td><?php echo $num; ?></td>
<td><?php echo $row['text']; ?></td>
<td>
<?php
if(is_array($row['useranswer'])){
echo implode(', ', $row['useranswer']);
}
else { echo $row['useranswer']; }
?>
</td>
<td><?php echo $row['answer']; ?></td>
<td><?php echo $row['score']; ?></td>
</tr>
<?php endforeach; ?>
</table>
<p>Пример обработки результатов тестирования Вы можете посмотреть на сайте <a href='http://www.4stud.info/controls/ '><b>http://www.4stud.info/</b></a></p>
<p>Обновления этого скрипта и другие примеры использования QuizML - на основном сайте проекта: <a href='http://quizml.webservis.ru/'><b>http://quizml.webservis.ru/</b></a></p>
<p class='footer'><a href='http://quizml.webservis.ru/'>QuizML</a>, 2010</p>
</div>
</body>
</html>
Хотя, конечно, передача из формы таких полей как qid1, qid2, qid3 ... и т.д. и присвоение им значений 1, 2, 3... соответсвенно - по моему не очень умно, так что тот, кто делал эту форму задал дополнительную работу.
И еще, оценки по вопросам, возможно, проставляются не совсем правильно, я не сильно разбирался.
Спустя 12 часов, 51 минута, 20 секунд (5.02.2012 - 07:55) Антон Котов написал(а):
Огромное СПАСИБО! Созерцая Вашу работу появляется огромное желание идти по Вашему пути и по мере возможности делиться своими знаниями со всеми желающими. Спасибо Вам. Как здорово, что есть люди способные помочь в трудную минуту.