Оцените код тестов.
Сделал тесты, без БД и файлов и ответов нету в браузере.
Попытался сделать структуру массива, приближённую к структуре БД. Оцените пожалуйста. Задача: Дан массив с вопросами и правильными ответами. Пользователь должен выбрать один и вариантов. Когда вопросы заканчиваются - он жмет на кнопку, страница обновляется и вместо вариантов под вопросами появляется сообщение вида: 'ваш ответ: ... верно!' или 'ваш ответ: ... неверно! Правильный ответ: ...'. Правильно отвеченные вопросы должны гореть зеленым цветом, а неправильно - красным. В массив можно сколько угодно засунуть тестов и в сам код обработки, лезть не придётся. $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++; } } } |
DivMan,
:victory: |
Чо реально, что ли?
|
Цитата:
|
А как проще?
|
Цитата:
Ассоциация на то и существует, чтобы проще было отождествлять. А у вас что получается - используете ассоциативный массив и при этом пишите такое: if(gettype($v) == 'array') Три(!) вложенных цикла для построения формы по заданной ассоциации, это уже перебор. Кроме этого, без БД - ладно, но разве нельзя использовать как и в БД уникальность? Ведь первичный ключ массива тоже будет уникальным и служить адресом опросов/вопросов/итп. А значит поля формы клиента адресуются по этим уникальным ключам. Вместо этого у вас опять бедлам с кучей условий и двумя вложенными циклами. |
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; |
DivMan,
Да, и читай разные методы в доках и в каких случаях их лучше использовать. |
Цитата:
|
Лентяй, ok
|
Часовой пояс GMT +3, время: 04:15. |