循环一些可能在PHP中未选中的复选框列表

循环一些可能在PHP中未选中的复选框列表,php,html,arrays,checkbox,Php,Html,Arrays,Checkbox,我有这样一个HTML模式: 链接: 复选框名称:Lunes列name=arrayLunes[]然后,Martes列name=arrayMartes[]等 首先,我想测试Lunes列表(星期一),如果我已经检查了第一个和第三个,数组将只有和[1]数组位置,但是我想要例如:[0]=true,[1]=false,[2]=true,[3..x]=false 类似于这段PHP代码的东西,显然不起作用,因为如果不选中复选框,将不会通过POST发送,因此它将是索引偏移错误 for ($c = 0; $c &

我有这样一个HTML模式:

链接:

复选框名称:Lunes列
name=arrayLunes[]
然后,Martes列
name=arrayMartes[]

首先,我想测试Lunes列表(星期一),如果我已经检查了
第一个
第三个
,数组将只有
和[1]
数组位置,但是我想要例如:
[0]=true,[1]=false,[2]=true,[3..x]=false

类似于这段PHP代码的东西,显然不起作用,因为如果不选中复选框,将不会通过POST发送,因此它将是索引偏移错误

for ($c = 0; $c < count($_POST['arrayLunes']); $c++)
    echo ($_POST['arrayLunes'][$c] == 'on' ? "YES" : "NO");

对于这个示例,我的javascript是:

有一个技巧,可以让您始终收到复选框的值:

<input type="hidden" name="arrayLunes[1]" value="0">
<input type="checkbox" name="arrayLunes[1]" value="1">

<input type="hidden" name="arrayLunes[2]" value="0">
<input type="checkbox" name="arrayLunes[2]" value="1">

最简单的解决方法是使用一个隐藏的输入作为value=0,假设它与后面的复选框同名


如果选中该复选框,您将看到其值,如果未选中,则将使用输入的值。

如果您不想使用JS,您可以这样做

<input type="hidden" name="arrayLunes" value="0" />
<input type="checkbox" name="arrayLunes" value="1" />

这样,您总是会收到一个复选框值的$\u帖子

foreach($_POST['arrayLunes']) as $index=>$value)
    echo ($value == 'on' ? "YES" : "NO").' index='.$index;

阅读

如果您的数据库中每一行都有一个唯一的ID,请将它添加到每一列的括号中,并结合隐藏元素技巧以始终获得帖子:

<input type="hidden" name="arrayLunes[1]" value="0" />
<input type="checkbox" name="arrayLunes[1]" value="1" />

<input type="hidden" name="arrayLunes[2]" value="0" />
<input type="checkbox" name="arrayLunes[2]" value="1" />

在我看来,最好的解决方案是使用
isset()
而不是与复选框的值进行比较

但是,为了做到这一点,您需要通过其他一些机制知道页面上有多少复选框

因此,在生成页面时,我建议您添加:

<input type="hidden" name="rowcount" value="<?=$x?>">

我不知道HTML是如何构建的,但假设您有以下复选框:

<input type="checkbox" name="check[]" value="a" />
<input type="checkbox" name="check[]" value="b" />
<input type="checkbox" name="check[]" value="c" />
<input type="checkbox" name="check[]" value="d" />
<input type="checkbox" name="check[]" value="e" />
如果发布了
a
e
,这将输出:

array (size=3)
  1 => string 'b' (length=1)
  2 => string 'c' (length=1)
  3 => string 'd' (length=1)
我忘了提到它还可以跟踪数组键的差异,不仅仅是值,例如,如果发布了
b
c
(1和2个键),输出将是:

array (size=3)
  0 => string 'a' (length=1)
  3 => string 'd' (length=1)
  4 => string 'e' (length=1)
所以未列出的密钥是0,3,4

$differences = array_diff($cb, $_POST['check']);
var_dump($differences); // unposted checkboxes with relevant keys
$diff1 = array_diff($cb,$differences);
var_dump($diff1); // posted checkboxes with relevant keys

我已经将属性值分配给了它应该是的“位置”,但是我没有找到正确的PHP算法来正确地执行它,PS:现在我明白你的意思了,我要试试。@Daniel:为什么这不起作用?现在,他对所有复选框都有一个值,并且可以在不冒索引偏移错误风险的情况下对它们进行迭代。更改了复选框的名称。因此,如果我执行
arrayLunes[]
操作,它将无法工作?我必须写索引吗?我这么说是因为我在用javascript添加行和删除行,我需要做得更简单,我可以做到。不,如果你想为每个现有的复选框接收一个值,你不能。如果您添加或删除一行,只需遍历所有现有行并重置索引。好的,它按照我的要求工作,我将取消复选框值,即它所在的位置,然后在隐藏中我将-1(因为我使用0作为第一个位置),因此如果我发现-1未选中,谢谢你的提示。我不使用foreach,因为我想知道purpouse中的索引,只是为了测试,主要问题是如果没有选中复选框,
post数组
不会存储它,所以我需要使用假值进行存储。测试上面我对它进行了更改。这是为了插入数据库,所有这些都是通过javascript处理的,添加/删除行,然后我必须在php中检查所有是否选中的内容。如果行是通过javascript添加的,那么在那里管理ID(而不是在数据库中)也同样容易。在1处启动一个计数器变量(如果加载数据,则显示最大ID),并为每个添加的新行添加1。无论如何生成复选框,如果($cbox->getAttribute('name')=='arrayLunes[]'){
要与$\u POST['arrayLunes'](
array\u diff
)和$\u POST的arrayMartes[]进行比较,只需再进行一次检查['arrayMartes'];查看我的上一次编辑,再差一次输出可以按顺序生成带有相关键的已发布复选框在任何情况下,我编辑了我的帖子,因此您可能会获得有关我所做工作的更多信息,我正在阅读所有答案并进行测试。如果您发现任何困难,请告诉我。我认为解决方案非常困难,请参阅TobiasKun回答,它非常简单且有效,无论如何谢谢您的帮助=)
$doc = new DOMDocument();
$doc->loadHTMLFile('test6.php');
$cboxes = $doc->getElementsByTagName('input');
foreach ($cboxes as $cbox) {
       if($cbox->getAttribute('type') == 'checkbox') {
           $cb[] = $cbox->getAttribute('value');
       }
}
$differences = array_diff($cb, $_POST['check']);
var_dump($differences);
array (size=3)
  1 => string 'b' (length=1)
  2 => string 'c' (length=1)
  3 => string 'd' (length=1)
array (size=3)
  0 => string 'a' (length=1)
  3 => string 'd' (length=1)
  4 => string 'e' (length=1)
$differences = array_diff($cb, $_POST['check']);
var_dump($differences); // unposted checkboxes with relevant keys
$diff1 = array_diff($cb,$differences);
var_dump($diff1); // posted checkboxes with relevant keys