Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.10.2017, 22:36
Профессор
Отправить личное сообщение для DivMan Посмотреть профиль Найти все сообщения от DivMan
 
Регистрация: 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>&nbsp;&nbsp;&nbsp;';
                    $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++;
        }
    }      
}
Ответить с цитированием
  #2 (permalink)  
Старый 01.10.2017, 22:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

DivMan,
Ответить с цитированием
  #3 (permalink)  
Старый 01.10.2017, 23:16
Профессор
Отправить личное сообщение для DivMan Посмотреть профиль Найти все сообщения от DivMan
 
Регистрация: 08.03.2016
Сообщений: 429

Чо реально, что ли?
Ответить с цитированием
  #4 (permalink)  
Старый 02.10.2017, 00:35
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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>&nbsp;&nbsp;&nbsp;';
$j++;
}
}
echo '<br>';

if($dano == 'question') {
echo $v . '<br>';
}
}
$i++;
}
И зачем такие сложности?
Ответить с цитированием
  #5 (permalink)  
Старый 02.10.2017, 06:08
Профессор
Отправить личное сообщение для DivMan Посмотреть профиль Найти все сообщения от DivMan
 
Регистрация: 08.03.2016
Сообщений: 429

А как проще?
Ответить с цитированием
  #6 (permalink)  
Старый 02.10.2017, 08:28
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от DivMan
А как проще?
А вы как думаете?
Ассоциация на то и существует, чтобы проще было отождествлять. А у вас что получается - используете ассоциативный массив и при этом пишите такое:

if(gettype($v) == 'array')

Три(!) вложенных цикла для построения формы по заданной ассоциации, это уже перебор.

Кроме этого, без БД - ладно, но разве нельзя использовать как и в БД уникальность? Ведь первичный ключ массива тоже будет уникальным и служить адресом опросов/вопросов/итп. А значит поля формы клиента адресуются по этим уникальным ключам. Вместо этого у вас опять бедлам с кучей условий и двумя вложенными циклами.
Ответить с цитированием
  #7 (permalink)  
Старый 02.10.2017, 12:54
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 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>&nbsp;&nbsp;&nbsp;';
}

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;
Ответить с цитированием
  #8 (permalink)  
Старый 02.10.2017, 12:57
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

DivMan,
Да, и читай разные методы в доках и в каких случаях их лучше использовать.
Ответить с цитированием
  #9 (permalink)  
Старый 02.10.2017, 13:07
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Rasy
ассоциативные ключи - лишнее
Это не так. И ваш тоже не блещет.
Ответить с цитированием
  #10 (permalink)  
Старый 02.10.2017, 13:18
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

Лентяй, ok

Последний раз редактировалось Rasy, 02.10.2017 в 13:38.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оцените код умножателя матриц somesomething Общие вопросы Javascript 1 06.04.2016 18:40
Создать код CSS+HTML JamesMorgan Общие вопросы Javascript 2 11.08.2015 12:50
Код ответа сервера и обновление iframe alexdemi911 Общие вопросы Javascript 6 10.08.2015 22:30
Оцените \ покритикуйте код, пожалуйста (верстка + js) Heian Ваши сайты и скрипты 6 17.09.2012 20:23
Требуется выводить код рекламного блока Adsense из файла JavaScript??? speedflow Элементы интерфейса 0 26.05.2012 15:50