01.10.2017, 22:36
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Оцените код тестов.
Сделал тесты, без БД и файлов и ответов нету в браузере.
Попытался сделать структуру массива, приближённую к структуре БД.
Оцените пожалуйста.
Задача:
Дан массив с вопросами и правильными ответами. Пользователь должен выбрать один и вариантов. Когда вопросы заканчиваются - он жмет на кнопку, страница обновляется и вместо вариантов под вопросами появляется сообщение вида: 'ваш ответ: ... верно!' или 'ваш ответ: ... неверно! Правильный ответ: ...'. Правильно отвеченные вопросы должны гореть зеленым цветом, а неправильно - красным.
В массив можно сколько угодно засунуть тестов и в сам код обработки, лезть не придётся.
$questions = [
1 => [
'question' => 'Сколько будет 2+2?',
'variants' => ['2', '4', '6'],
'answer' => '1'
],
2 => [
'question' => 'Сколько будет 5+5?',
'variants' => ['10', '55', '25'],
'answer' => '0'
],
3 => [
'question' => 'Зимой и летом, одним цветом?',
'variants' => ['Крокодил', 'трава'],
'answer' => '0'
]
];
if(empty($_GET['proverka'])) {
echo '<form action="" method="get">';
$i = 1;
foreach($questions as $num) {
foreach($num as $dano => $v) {
if(gettype($v) == 'array') {
$j = 0;
foreach($v as $val) {
echo '<label>'.$val.'<input type="radio" name="'.$i.'" value="'.$j.'"></label> ';
$j++;
}
}
echo '<br>';
if($dano == 'question') {
echo $v . '<br>';
}
}
$i++;
}
echo '<br>';
echo '<input type="submit" name="proverka" value="Проверить">';
echo '</form>';
}
if(!empty($_GET['proverka'])) {
if(count($_GET)-1 < count($questions)) {
echo 'Ответьте на все вопросы.';
}
else {
$k = 1;
foreach($questions as $num) {
foreach($num as $dano => $v) {
if($dano == 'answer') {
if($_GET[$k] == $v) {
echo $questions[$k]['question'] .'<br> <span style="color: green; font-weight: bold;">Ваш ответ '.$questions[$k]['variants'][$_GET[$k]].' - правильно</span><br><br>';
}
else {
echo $questions[$k]['question'] .'<br><span style="color: red; font-weight: bold;">Ваш ответ '.$questions[$k]['variants'][$_GET[$k]].' - неправильно, правильный ответ: '.$questions[$k]['variants'][$questions[$k]['answer']].'</span><br><br>';
}
}
}
$k++;
}
}
}
|
|
01.10.2017, 22:57
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
DivMan,
|
|
01.10.2017, 23:16
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Чо реально, что ли?
|
|
02.10.2017, 00:35
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от DivMan
|
foreach($questions as $num) {
foreach($num as $dano => $v) {
if(gettype($v) == 'array') {
$j = 0;
foreach($v as $val) {
echo '<label>'.$val.'<input type="radio" name="'.$i.'" value="'.$j.'"></label> ';
$j++;
}
}
echo '<br>';
if($dano == 'question') {
echo $v . '<br>';
}
}
$i++;
}
|
И зачем такие сложности?
|
|
02.10.2017, 06:08
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
А как проще?
|
|
02.10.2017, 08:28
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от DivMan
|
А как проще?
|
А вы как думаете?
Ассоциация на то и существует, чтобы проще было отождествлять. А у вас что получается - используете ассоциативный массив и при этом пишите такое:
if(gettype($v) == 'array')
Три(!) вложенных цикла для построения формы по заданной ассоциации, это уже перебор.
Кроме этого, без БД - ладно, но разве нельзя использовать как и в БД уникальность? Ведь первичный ключ массива тоже будет уникальным и служить адресом опросов/вопросов/итп. А значит поля формы клиента адресуются по этим уникальным ключам. Вместо этого у вас опять бедлам с кучей условий и двумя вложенными циклами.
|
|
02.10.2017, 12:54
|
Профессор
|
|
Регистрация: 17.06.2016
Сообщений: 509
|
|
DivMan,
Главное, чтобы смог прочитать свой код в будущем. Из-за большой вложенности ты в нем легко запутаешься.
Работая с массивом, как индексируемым, ассоциативные ключи - лишнее.
Вместо инкрементирования счетчика $i в цикле, в foreach можно определить переменную $key для подобного рода задач.
$questions = [
[
'question' => 'Сколько будет 2+2?',
'variants' => ['2', '4', '6'],
'answer' => '1'
],
[
'question' => 'Сколько будет 5+5?',
'variants' => ['10', '55', '25'],
'answer' => '0'
],
[
'question' => 'Зимой и летом, одним цветом?',
'variants' => ['Крокодил', 'трава'],
'answer' => '0'
]
];
$html = '';
function printInputs($i, $n, $k)
{
global $html;
$html .= '<label>'.$i.'<input type="radio" name="'.$k.'" value="'.$n.'"></label> ';
}
function printResult($b, $k, $v, $arr)
{
global $html;
$msg = '';
$style = '';
if ($b) {
$style = ' style="color: green; font-weight: bold"';
$msg = 'правильно';
} else {
$style = ' style="color: red; font-weight: bold"';
$msg = 'неправильно, правльный ответ: ' . $arr[$k]['variants'][(int)$arr[$k]['answer']];
}
$html .= '<p>'.$arr[$k]['question'].'<br><span '. $style.'>Ваш ответ '.$arr[$k]['variants'][$v].' - '.$msg.' </span></p>';
}
if(empty($_GET['proverka'])) {
$html .= '<form action="" method="get">';
foreach($questions as $key => $arr) {
if (array_key_exists('question', $arr))
$html .= '<p>' . $arr['question'] . '</p>';
if (array_key_exists('variants', $arr) && is_array($arr['variants']))
array_walk($arr['variants'], 'printInputs', $key);
}
$html .= '<p><input type="submit" name="proverka" value="Проверить"></p></form>';
} else {
if (count($_GET)-1 < count($questions)) {
$html .= 'Ответьте на все вопросы!';
} else {
array_pop($_GET);
foreach ($_GET as $key => $value) {
if ($value == $questions[$key]['answer']) {
printResult(true, $key, $value, $questions);
} else {
printResult(false, $key, $value, $questions);
}
}
}
}
echo $html;
|
|
02.10.2017, 12:57
|
Профессор
|
|
Регистрация: 17.06.2016
Сообщений: 509
|
|
DivMan,
Да, и читай разные методы в доках и в каких случаях их лучше использовать.
|
|
02.10.2017, 13:07
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Rasy
|
ассоциативные ключи - лишнее
|
Это не так. И ваш тоже не блещет.
|
|
02.10.2017, 13:18
|
Профессор
|
|
Регистрация: 17.06.2016
Сообщений: 509
|
|
Лентяй, ok
Последний раз редактировалось Rasy, 02.10.2017 в 13:38.
|
|
|
|