未选中数组中的复选框

时间:2011-03-31 15:23:47

标签: php arrays forms checkbox

我正在构建一个可以添加更多字段组的表单来处理它们我在for循环中读出数组

脚本:

<?php
foreach ($_POST as $key => $value) {
  $$key = $value;
}
$count = count($name);
for ($i=0; $i<$count; $i++){
?>
  <strong><?php echo $name[$i]; ?></strong>  (<?php echo $check[$i]; ?>)<br /><?php echo $select[$i]; ?><br /><br />
<?php
}
?>
<form method="post">
<div class="group">
 <input type="text" name="name[]" /><br />
 <input type="checkbox" name="check[]" value="true" /><br />
 <select name="select[]"><option>1</option><option>2</option><option>3</option></select>
</div>
<div class="group">
 <input type="text" name="name[]" /><br />
 <input type="checkbox" name="check[]" value="true" /><br />
 <select name="select[]"><option>1</option><option>2</option><option>3</option></select>
</div>
<div class="group">
 <input type="text" name="name[]" /><br />
 <input type="checkbox" name="check[]" value="true" /><br />
 <select name="select[]"><option>1</option><option>2</option><option>3</option></select>
</div>
<button>Add another group</button>
<input type="submit" />
</form>

如果选中所有复选框都没有问题,但如果只检查了最后一个复选框,则它只计算数组中的一个复选框,然后将name [0]与check [0]组合,但检查[0]确实是检查[ 2]。英语不是我的母语,所以我不知道正确的单词。

4 个答案:

答案 0 :(得分:7)

实际上,Sam在Stack Overflow的答案中提出了一个不错的解决方法:

Post the checkboxes that are unchecked

它对我有用,我怀疑你和我有类似的问题(我的是在类似的(ish)组中有/或者有300个以上的输入字段,并且不想为每一个都编写验证规则那些单独的字段,只是针对每个输入类型系列的规则,例如电子邮件地址或邮政编码。简而言之,技术是在复选框字段之前放置一个具有相同名称的隐藏输入字段。设置值隐藏字段(type ='hidden')为'0'将确保POST数组中至少出现一个键/值,仅当选中该复选框时,'0'才被后来的'1'取代.I需要'0'值才能让人们“取消设置”他们之前“设置”的选项,例如他们愿意显示他们的联系人数据。这种技术可以让我向用户呈现更多相同的表格以进行更新因为他们会在第一次注册时获得。感谢Sam!

答案 1 :(得分:2)

这是正常的PHP行为,当未选中复选框时,它不包含在$ _POST变量中......

答案 2 :(得分:1)

是。这就是来龙去脉。没有解决方法。使用field[]标识符仅适用于非结构化输入字段。如果您依赖于排序和关系,那么取消设置字段将阻止其工作。

除了设置显式索引之外别无选择。你应该咬一口酸苹果,并为name[0]check[1]select[2]这样做。使用PHP循环来简化它:

foreach (range(0,2) as $i)
echo <<< END
<div class="group">
 <input type="text" name="name[$i]" /><br />
 <input type="checkbox" name="check[$i]" value="true" /><br />
 <select name="select[$i]"><option>1</option><option>2</option><option>3</option></select>
</div>
END

答案 3 :(得分:0)

我对表格的某些部分存在相同的确切问题,可以根据用户的意愿添加。我使用基本的javascript来到了这个非常简单的解决方法:

在复选框之后添加一个隐藏类型输入,将其值分配给复选框的状态,并且此隐藏输入将在$ _POST中报告,将为 true 错误

<input type="checkbox" onchange="this.nextSibling.value = this.checked">
<input type="hidden" name="state[]" value="false">

如果您的复选框默认为checked="checked",只需将值更改为 true