Такое поведение неудивительно, поскольку браузер не отправляет значения для флажков, которые не отмечены.
Если вы находитесь в ситуации, когда вам необходимо представить точное количество элементов в виде массива, почему бы вам не сделать то же самое, что вы делаете, когда есть 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);
увидеть его в действии .