PHP For循环,复选框没有给出预期的输出

时间:2017-08-29 07:15:56

标签: loops for-loop checkbox

我从以下代码中获得了一些意外的输出,但无法弄清问题是什么。

   <?
    if (isset($_POST['submit'])) {
    echo "<pre>";
    print_r($_POST);
    exit;
    }
    echo "<form action='test1.php' method='post'>";
    for ($i=0;$i < 10;$i++) {
    echo "<input type='text' value='$i' name='field[]'>";
    echo "<input type='hidden' name='cbox[]' value='0'>";
    echo "<input type='checkbox' value='1' name='cbox[]'><br>";
    }
    echo "<br><input type='submit' name='submit' value='go'>";
    ?>

如果我运行这个,检查说4号和6号,我得到这个输出:

Array
(
    [field] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
            [3] => 3
            [4] => 4
            [5] => 5
            [6] => 6
            [7] => 7
            [8] => 8
            [9] => 9
        )

    [cbox] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
            [3] => 0
            [4] => 0
            [5] => 1
            [6] => 0
            [7] => 0
            [8] => 1
            [9] => 0
            [10] => 0
            [11] => 0
        )

    [submit] => go
)

为什么cbox没有像我期望的那样在4和6旁边给我一个1的结果?

2 个答案:

答案 0 :(得分:0)

  

为什么cbox没有像我期望的那样在4和6旁边给我一个1的结果?

因为在这些“位置”中有一个名称相同且值为0的隐藏字段。

只有选中复选框后才会提交复选框值。因此,当您选中复选框4(第五个)时,您有四次隐藏输入和四个复选框。由于未选中任何复选框,因此提交了四次0(隐藏字段)。现在,您检查第五个复选框,现在提交隐藏字段复选框的值。我们已经有4个0,现在我们有另一个0然后是1 - 使得5为0,然后是1,所以1最终在数组索引5处。

按设计工作。

我会完全取消隐藏字段,并指定要使用的索引 - name='cbox[0]'name='cbox[1]',...

您仍将只获取已检查的值的值 - 但现在您的索引关联会自动匹配文本字段的值(当然,这些也是相同的命名方案。)

答案 1 :(得分:0)

我认为你需要在复选框和隐藏字段中强制数组索引,如下所示:

<?
if (isset($_POST['submit'])) {
  echo "<pre>";
  print_r($_POST);
  exit;
}
echo "<form action='test1.php' method='post'>";
for ($i=0;$i < 10;$i++) {
  echo "<input type='text' value='$i' name='field[]'>";
  echo "<input type='hidden' name='cbox[$i]' value='0'>";
  echo "<input type='checkbox' value='1' name='cbox[$i]'><br>";
}
echo "<br><input type='submit' name='submit' value='go'>";
?>

这样,如果选中它,复选框将覆盖隐藏的字段值。如果在字段名称中省略$ i,则值将在输出数组中汇总(因为您可以看到输出数组中有12个值,隐藏字段中有10个,复选复选框中有2个)。