Массивы POST, не отображающие отмеченные флажки

Не удалось получить мои массивы POST, чтобы показать все значения флажка из моей формы.

У меня есть форма, созданная следующим образом:

<form name='foo' method='post' action=''> <table> <tr> <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> </tr> <tr> <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> </tr> <tr> <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> </tr> </table> </form> 

У меня есть кнопка внизу, связанная с функцией jquery, которая добавляет еще 5 пустых строк в форму (следовательно, массивы для имени ввода cBox []).

Теперь проблема. Предположим, что первый флажок снят, и проверены последние 2. Когда я вывожу значения (используя PHP print_r для отладки), я получу:

 Array ( [0] => on [1] => on) 

По какой-то причине массив не содержит значения для снятых флажков.

Я видел некоторые решения, где скрытая переменная передается с каждым флажком, но может ли это решение быть реализовано в моей ситуации (используя массивы)?

Solutions Collecting From Web of "Массивы POST, не отображающие отмеченные флажки"

Такое поведение неудивительно, поскольку браузер не передает никаких значений для отмеченных флажков.

Если вы находитесь в ситуации, когда вам нужно представить точное количество элементов в виде массива, почему бы вам не сделать то же самое, что и вы, когда есть определенный id связанный с каждым флажком? Просто укажите имя ключа массива PHP как часть имени элемента <input> :

  <tr> <!-- NOTE [0] ---> <td class='bla'>Checkbox: <input type='checkbox' name='cBox[0]'/></td> </tr> <tr> <td class='bla'>Checkbox: <input type='checkbox' name='cBox[1]'/></td> </tr> <tr> <td class='bla'>Checkbox: <input type='checkbox' name='cBox[2]'/></td> </tr> 

Это все еще оставляет вам проблему с тем, что неконтролируемые поля все равно не будут присутствовать в массиве. Это может быть или не быть проблемой. Во-первых, вам действительно не все равно:

 foreach($incoming as $key => $value) { // if the first $key is 1, do you care that you will never see 0? } 

Даже если вам все равно, вы можете легко исправить проблему. Здесь есть два простых подхода. Во-первых, просто сделайте скрытый входной трюк:

  <tr> <td class='bla'> <input type="hidden" name="cBox[0]" value="" /> Checkbox: <input type='checkbox' name='cBox[0]'/> </td> </tr> <tr> <td class='bla'> <input type="hidden" name="cBox[1]" value="" /> Checkbox: <input type='checkbox' name='cBox[1]'/> </td> </tr> 

И два, которые я считаю предпочтительными, вместо этого заполняем пробелы из PHP:

 // assume this is what comes in: $input = array( '1' => 'foo', '3' => 'bar', ); // set defaults: array with keys 0-4 all set to empty string $defaults = array_fill(0, 5, ''); $input = $input + $defaults; print_r($input); // If you also want order, sort: ksort($input); print_r($input); 

Смотрите в действии .

ONE TRICK переопределяет значение флажка, если отмечено. в противном случае его значение будет равно 0.

 <form> <input type='hidden' value='0' name="smth"> <input type='checkbox' value='1' name="smth"> </form> 

Пытаться

 <input type='checkbox' value="XXX" name='cBox[]'/> <input type='checkbox' value="YYY" name='cBox[]'/> <input type='checkbox' value="ZZZ" name='cBox[]'/> 

Флажки работают так. Если он проверен, только после этого значение будет опубликовано.

Если вы работаете с динамическим блоком checkbox, вы можете попробовать следующее:

HTML:

 <label> <input type="hidden" name="cBox[]" value="" /> <input type="checkbox" class="checkbox" value="on" /> </label> <label> <input type="hidden" name="cBox[]" value="" /> <input type="checkbox" class="checkbox" value="on" /> </label> <!-- extend --> 

Javascript (jQuery):

 $(document).on("change", "input.checkbox", function() { var value = $(this).is(":checked") ? $(this).val() : null; $(this).siblings("input[name='cBox[]']").val(value); }); 

Результат бэкэнд (если проверен только второй):

 // PHP $_POST['cBox'] Array ( [0] => [1] => on ) 

В этом инструменте флажки используются для управления каждым скрытым входом в группе.

Для отображения страницы вы можете визуализировать каждую пару входов обратно, назначив значение в скрытые входы и checked флажки, как checked .

Попробуйте установить значение для каждого флажка, равного 1 или true.

 <input type='checkbox' value='1' name='cBox[1]'/> 

может быть, почему он ничего не посылает?