【问题标题】:Loop a list of checkboxes that some probabbly are not checked in PHP循环在 PHP 中可能未选中的复选框列表
【发布时间】:2013-07-08 15:10:45
【问题描述】:

我有一个这样的 HTML 架构:

链接:http://i.stack.imgur.com/9RRpx.jpg

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

首先,我想测试 Lunes 列表(星期一),如果我检查了 firstthird,数组将有 only [0] and [1] 数组位置,但我想例如:[0] = true, [1] = false, [2] = true, [3 .. x] = false

类似这样的 PHP 代码,显然是行不通的,因为如果未选中复选框,则不会通过 POST 发送,所以它将是 index offset error

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

结论:所以,现在,$_POST['arrayLunes'] 变量将按顺序包含 checkbox checked,我也需要未选中的变量,在他各自的位置。

我该怎么做或如何模拟它?

编辑

我的 HTML 代码是这样的

<div style="margin-left: 5px; padding: 5px;">
    <input class="btnFranjas" type="button" value="- Quitar franja" onclick="removerFranjaCalendario();" />
    <input class="btnFranjas" type="button" value="+ Añadir franja" onclick="addFranjaCalendario();" />
    <input class="btnFranjas" type="button" value="Reestablecer" onclick="reestablecerFranja();" />
</div>
<form action="index.php?zona=plataforma&id=<?php echo $_GET['id']; ?>&acceso=<?php echo $_GET['acceso']; ?>" method="post">
    <table id="tablaCalendario">
        <thead>
            <th>Horario</th>
            <th>Lunes</th>
            <th>Martes</th>
            <th>Miércoles</th>
            <th>Jueves</th>
            <th>Viernes</th>
            <th>Sábado</th>
            <th>Domingo</th>
        </thead>
        <tbody>
            <tr style="background: #E0E6F8;">
                <td>
                    <table>
                        <tr>
                            <td><b>Inicio: </b></td>
                            <td>
                                Hora
                                <select id='arrayInicioHora[]' name='arrayInicioHora[]'>
<?php
                                    for ($c = 0; $c < 24; $c++)
                                        echo "    <option value='" . $c . "'>".($c > 9 ? $c : "0" . $c)."</option>";
?>
                                </select>
                            </td>
                            <td>
                                Minuto
                                <select id='arrayInicioMinuto[]' name='arrayInicioMinuto[]'>
<?php
                                    for ($c = 0; $c < 60; $c++)
                                        echo "<option value='" . $c . "'>".($c > 9 ? $c : "0" . $c)."</option>";
?>
                                </select>
                            </td>
                        </tr>
                        <tr>
                            <td><b>Fin: </b></td>
                            <td>
                                Hora
                                <select id='arrayFinHora[]' name='arrayFinHora[]'>
<?php
                                    for ($c = 0; $c < 24; $c++)
                                        echo "<option value='" . $c . "'>".($c > 9 ? $c : "0" . $c)."</option>";
?>
                                </select>
                            </td>
                            <td>
                                Minuto
                                <select id='arrayFinMinuto[]' name='arrayFinMinuto[]'>
<?php
                                    for ($c = 0; $c < 60; $c++)
                                        echo "    <option value='" . $c . "'>".($c > 9 ? $c : "0" . $c)."</option>";
?>
                                </select>
                            </td>
                        </tr>
                    </table>
                </td>
                <td align="center"><input type="checkbox" name="arrayLunes[]" id="arrayLunes[]" value="0" /> <input type="text" placeholder="Valor" name="arrayValorLunes[]" id="arrayValorLunes[]" style="width: 60px;" /></td>
                <td align="center"><input type="checkbox" name="arrayMartes[]" id="arrayMartes[]" value="0" /> <input type="text" placeholder="Valor" name="arrayValorMartes[]" id="arrayValorMartes[]" style="width: 60px;" /></td>
                <td align="center"><input type="checkbox" name="arrayMiercoles[]" id="arrayMiercoles[]" value="0" /> <input type="text" placeholder="Valor" name="arrayValorMiercoles[]" id="arrayValorMiercoles[]" style="width: 60px;" /></td>
                <td align="center"><input type="checkbox" name="arrayJueves[]" id="arrayJueves[]" value="0" /> <input type="text" placeholder="Valor" name="arrayValorJueves[]" id="arrayValorJueves[]" style="width: 60px;" /></td>
                <td align="center"><input type="checkbox" name="arrayViernes[]" id="arrayViernes[]" value="0" /> <input type="text" placeholder="Valor" name="arrayValorViernes[]" id="arrayValorViernes[]" style="width: 60px;" /></td>
                <td align="center"><input type="checkbox" name="arraySabado[]" id="arraySabado[]" value="0" /> <input type="text" placeholder="Valor" name="arrayValorSabado[]" id="arrayValorSabado[]" style="width: 60px;" /></td>
                <td align="center"><input type="checkbox" name="arrayDomingo[]" id="arrayDomingo[]" value="0" /> <input type="text" placeholder="Valor" name="arrayValorDomingo[]" id="arrayValorDomingo[]" style="width: 60px;" /></td>
            </tr>
        </tbody>
    </table>
    <input class="orangebutton" type="submit" name="enviarCalendario" id="enviarCalendario" onclick="return confirmacionAccion();" value="Enviar calendario" />
</form>

还有我用于此示例的 javascript:http://pastebin.com/eKFwMFvD

【问题讨论】:

    标签: php html arrays checkbox


    【解决方案1】:

    有一个技巧,所以你总是会收到一个复选框的值:

    <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">
    

    因此,如果选中该复选框,您将收到 1 作为值,否则您将收到 0

    编辑:

    就像丹尼尔说你有不止一个 arrayLunes。因此,您必须手动向数组表示法添加索引。见上文。

    要遍历您的复选框,请执行以下操作:

    foreach($_POST['arrayLunes'] as $val)
        echo $val ? "YES" : "NO";
    

    【讨论】:

    • 我已将属性值分配给它应该是的“位置”,但我没有找到正确的 PHP 算法来正确执行此操作,PS:现在我明白你的意思了,我是去试试看。
    • @Daniel:为什么这不起作用?现在他总是对所有复选框都有一个价值,并且可以遍历它们而不会冒险index offset error 编辑:好的,现在我明白了。更改了复选框的名称。
    • 所以如果我这样做arrayLunes[] 它不会工作?我必须写索引吗?我这么说是因为我正在通过 javascript 添加行和删除行,我需要做得更简单,我可以做到。
    • 不,如果您想接收每个现有复选框的值,则不能。如果您添加或删除一行,只需遍历所有现有行并重置索引。
    • 好的,它按我的意愿工作,我把复选框值,它所在的位置,然后在隐藏中我放-1(因为我使用0作为第一个位置) ,所以如果我发现 -1 未被选中,感谢您的提示。
    【解决方案2】:

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

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

    所以在生成页面的时候,我建议你添加:

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

    ...在包含表格行的表单中的某处,其中$x 是在页面上创建的行数。

    这样,接收表单的代码可以简单地这样做:

    for ($c = 0, $count = (int) $_POST['rowcount']; $c < $count; $c++)
    {
        echo isset($_POST['arrayLunes'][$c]) ? "YES" : "NO";
    }
    

    【讨论】:

      【解决方案3】:

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

      <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" />
      

      【讨论】:

      • 为了插入数据库,全部由javascript处理,添加/删除行,然后我必须检查所有内容是否在php中检查。
      • 如果行是通过 javascript 添加的,那么在那里而不是在数据库中管理 ID 一样容易。从 1 开始一个计数器变量(如果您加载数据,则显示最大的 ID)并为添加的每个新行添加 1。
      【解决方案4】:

      试试这个,

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

      阅读getting a checkbox array value from POST

      【讨论】:

      • 我不使用foreach,因为我想知道索引的目的,只是为了测试,主要问题是如果未选中复选框,post array 不会存储它,所以我需要存储但具有错误值。
      • 测试上面我已经做了修改。
      【解决方案5】:

      我不知道您的 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" />
      

      在这种情况下,如果所有这些都发布,$_POST['check'] 将包含 0=>a、1=>b 等等。

      如果只检查第一个和最后一个,您将有 1=>a, 2=>e,您需要查看哪些未检查 (b,c,d)

      我的解决方案如下:

      从 HTML 中获取所有复选框并与发布的复选框进行比较:

      $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);
      

      如果发布了ae,则会输出:

      array (size=3)
        1 => string 'b' (length=1)
        2 => string 'c' (length=1)
        3 => string 'd' (length=1)
      

      我忘了提到它也可以跟踪数组键的差异,而不仅仅是值,例如如果发布了 bc(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
      

      【讨论】:

      • 无论复选框是如何生成的,您只需要再检查一次 if($cbox-&gt;getAttribute('name') == 'arrayLunes[]') { 即可与 $_POST['arrayLunes'] (array_diff) 和 arrayMartes[] 与其 $ _POST['arrayMartes'];
      • 查看我的上一次编辑,再相差一次,输出可以为您生成已发布的复选框及其相关键的顺序
      • 无论如何我编辑了我的帖子,所以你可能会得到更多关于我在做什么的信息,我正在阅读所有答案并进行测试
      • 如果您发现任何困难,请告诉我
      • 我认为解决方案非常困难,请参阅 TobiasKun 的答案,它非常简单且有效,无论如何感谢您的帮助 =)
      【解决方案6】:

      最简单的解决方法是使用隐藏输入作为 value=0 假设它与它后面的复选框具有相同的名称。

      如果复选框被选中,您将看到它的值,如果没有,则将使用输入的值。

      【讨论】:

        【解决方案7】:

        如果你不想使用 JS - 你可以这样做

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

        这样你总是会收到一个复选框值的 $_POST

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多