【问题标题】:Php For Loop giving an extra iterationPhp For Loop 提供额外的迭代
【发布时间】:2018-05-16 18:31:03
【问题描述】:

我正试图在这里弄清楚一些事情。

我有一个未序列化的数组,其中包含从数据库中出来的多项选择题。

我需要这个循环,所以当这个人提交答案时,评分页面需要知道需要多少次循环才能获得正确和错误的答案。

我的问题是它通过一个测试问题额外计算一次,并在最后给出错误的结果。例如,当只有一个问题时说“你答对了 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 题。”尽管只有两个问题。

【问题讨论】:

  • 告诉我们test array
  • 这看起来很危险foreach ($testArray as $testArray['row']) 为什么不做一个简单的foreach ($testArray as $row) 并避免弄乱你的输入数组
  • $testArray 被声明为未序列化的测试,它被保存到包含多个测试的表中。你是说,在它被反序列化之后,声明 $row = ['row']?

标签: php html for-loop foreach


【解决方案1】:

我认为这是您所看到的主要解释:

$numberOfLoops = 1;

然后你为每个问题增加它。所以$numberOfLoops 总是比问题的数量多一个。然后在for 循环的继续条件中,您有

$x <= $num

所以如果你有两个问题,比如$numberOfLoops就是3,循环会执行3次。

【讨论】:

    【解决方案2】:

    不要这样做

    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
    )
    

    【讨论】:

    • 我在很大程度上同意这一点,但使用 $testArray['row'] 不会导致额外的迭代,因为 foreach 迭代数组的副本,并且不受原始数组更改的影响.
    • @Don'tPanic 你让我思考,所以我检查了它。这会将 row 出现添加到原始数组中。
    • 是的,确实如此,我只是说新密钥不会包含在 foreach 迭代中。
    猜你喜欢
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多