@hollanditkzn

Как организовать тесты на php?

Я вывел данные из бд. У меня строится так что 1 тема имеет допустим 3 вопроса(может быть больше 10-15 вопросов) и у каждого вопроса 3 ответа(может быть и больше ответов).
И они все связанные и чтобы их вывести у меня встал вопрос как это сделать. Если не лепить массив свой. Мой пример реализации
Контроллер
public function actionTesting($id)
    {
        $answear = Answers::find()->where(['id_thema' => $id])->all();

        return $this->render('test', [
            'model' => $model,
            'answear' => $answear,
        ]);
    }

Во вьюшке
<?php
$this->title = $answear[0]->thema->name;
?>

<div class="test-testing">

    <?php foreach ($answear as $value){
        echo $value->question->name.'<br/>';
/** Вот тут непонятно как выводить*/
        echo $value->text.'<br/>';
    } ?>

</div>

Иначе у меня получается
Вопрос первый
один-два дня
Вопрос первый
более 5 дней
Вопрос первый
3-5 дней
Вопрос второй
да
Вопрос второй
нет
Вопрос второй
не постоянно, Меняется постоянно
Вопрос третий
да
Вопрос третий
нет
Вопрос третий
не помню

А мен нужно
Вопрос первый
- один-два дня
- более 5 дней
- 3-5 дней

Как стоит это сделать?
  • Вопрос задан
  • 578 просмотров
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Перебирать надо не варианты ответов, а вопросы, а через связь тянуть ответы к ним
$questions = Question::find()
                          ->with('answers') //грузим одним запросом все ответы к выбранным вопросам
                           ->all();
foreach ($questions as $question){
        echo $question->name . '<br/>';
        foreach ($question->answers as $answer){
             echo $answer->text . '<br/>';
        }
}

Но тут вопрос вообще в целесообразности хранить вопросы и ответы в отдельных таблицах, я бы хранил в одной. Ответы при этом в виде json и еще одна ячейка с ключом верного ответа.
id | question | answers | right
В afterFind приводим json в обычный php массив, с помощью JsonHelper и юзаем.
foreach (Question::find()->all() as $question){
        echo $question->name . '<br/>';
        foreach ($question->answers as $key=>$answer){
             echo $answer . '<br/>';
        }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы