Php For Loop дает дополнительную итерацию - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь что-то здесь выяснить.

У меня есть несериализованный массив, содержащий вопросы с несколькими вариантами ответов, которые выводятся из базы данных в раскрывающемся списке.

Мне нужно это для циклического переборакогда человек отправляет ответы, страница оценки должна знать, сколько циклов нужно просчитать, чтобы выбрать правильные и неправильные ответы.

Моя проблема заключается в том, что он подсчитывает через тестовый вопрос еще один рази дает ложный результат в конце.Сказать «вы правильно ответили на 2 вопроса», когда был только один вопрос, например.

Вот массив, напечатанный из базы данных, который тестируемый видит перед отправкой ответа.

<form class="create-test" action="grade.php" method="POST">



 <?php
    $numberOfLoops = 1;
    foreach ($testArray as $testArray['row']) {
        //echo  $testArray['row']['choice1'];

    //}
    //for ($i = 1; $i <= $quantity; $i++){
    ?>
        <label for='test-question'><?php echo $testArray['row']['question']; ?></label>

        <!-- Loop to go through the question array from the database, to be posted to the grading funciton -->
        <select class = 'form-control' name="Question<?php echo $numberOfLoops; ?>">
          <option value="Select an answer" disable selected hidden>Select an answer</option> 
          <option value="<?php echo $testArray['row']['choice1']; ?>"><?php echo $testArray['row']['choice1']; ?></option>
          <option value="<?php echo $testArray['row']['choice2']; ?>"><?php echo $testArray['row']['choice2']; ?></option>
          <option value="<?php echo $testArray['row']['choice3']; ?>"><?php echo $testArray['row']['choice3']; ?></option>
        </select> 

        <input type="hidden" class='form-control' id='actanswer' name="actanswer<?php echo $numberOfLoops; ?>"  value="<?php echo $testArray['row']['answer']; ?>">
        <div class="line"></div>
        <?php
            $numberOfLoops++;
        }

        echo "<input type='hidden' name='numberOfLoops' value='".$numberOfLoops."'>";
    ?>
    <input type='hidden' name='test-id' value="<?echo $testID; ?>">
    <button type="submit" class="btn btn-primary btn-lg" name='submit-answers'>Submit Answers</button>
</form>

А вот цикл for, который ищет ответы.

  $correct = 0;
    $incorrect = 0;

    $num = $_POST['numberOfLoops'];

echo $num;

for ($x = 1; $x <= $num; $x++) {
    $response = $_POST['Question'.$x];
    echo $response."<br>";
    $answer = $_POST['actanswer'.$x];
    echo $answer."<br>";
    if($answer == $response){
        $correct++;


    }elseif($response !== $answer){
        $incorrect++;
    }


}

Он всегда будет считать один лишний, независимо от количества вопросов.

Вся помощь и отзывы приветствуются.

РЕДАКТИРОВАТЬ: В качестве дополнительной информации, есть эхо-тег, который скажет, что вы правильно x и y неправильно.Если тест состоит из двух вопросов, он скажет.«Вы правильно поняли 3 вопроса, а 0 - нет».Хотя есть только два вопроса.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Я думаю, что это главное объяснение того, что вы видите:

$numberOfLoops = 1;

Затем вы увеличиваете его для каждого вопроса. Так что $numberOfLoops всегда будет на один больше, чем количество вопросов. Тогда в условии продолжения для вашего for цикла у вас есть

$x <= $num

Так, если у вас есть два вопроса, например, $numberOfLoops будет 3, и цикл будет выполнен три раза.

0 голосов
/ 16 мая 2018

Не делай этого

foreach ($testArray as $testArray['row']) {

Это создает новое вхождение в $testArray и, вероятно, объясняет вашу дополнительную итерацию.

Вместо этого попробуйте

foreach ($testArray as $row) {

и измените код, следующий за этой строкой, чтобы использовать $row['choice1'] и т. Д.

Пример:

$sessions = [ 'a','b'];
foreach ( $sessions as $sessions['row']) {
    echo $sessions['row'].PHP_EOL;
}

print_r($sessions);

Будет выводить:

a
b
Array
(
    [0] => a
    [1] => b
    [row] => b
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...