[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обработка данных $_POST в цикле forech
Антон Котов
Здравствуйте уважаемые гуру программисты.Несколько дней пытаюсь состряпать какой-нибудь рабочий "тест-вопросник".Пошарившись по инету в поисках готовых примеров,я вспомнил, что есть Вы!Мне понравилась ваша способность правильно , конструктивно преподносить информацию.Обращаюсь к Вам с вопросом, как можно правильно обрабатывать данные в массивах :
за основу взял 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 я убрал, чтоб не занимал место):
<?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) Антон Котов написал(а):
Огромное СПАСИБО! Созерцая Вашу работу появляется огромное желание идти по Вашему пути и по мере возможности делиться своими знаниями со всеми желающими. Спасибо Вам. Как здорово, что есть люди способные помочь в трудную минуту.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.