Ответ был правильным в двоичном варианте.
Бывает, что десятичное число, преобразованное в двоичное, дает вам ТОЧНО комбинацию необходимых вам опций. Единицы для «выбранной» опции и Ceroes для не выбранных (читайте справа налево)
Таким образом, уловка, чтобы спасти их, легка.
Присвойте каждому флажку значение 2 ^ index, где index - это идентификатор вашего флажка / порядок
… and you'll get
2^index0 = 1
2^index1 = 2
2^index2 = 4
2^index3 = 8
…and so on.
Затем вы суммируете значения своих флажков, скажем,
$options_dec = sum($_POST['options']); //outputs 5 if options 0 and 2 are selected
Эта десятичная сумма, преобразованная в двоичную, показывает, какие именно флажки были выбраны:
$options_bin = base_convert ( $options_dec, 10, 2 ); //outputs 0101 (reads right to left)
Теперь вы можете преобразовать его в массив, инвертировать его и вызвать каждый из них, соответствующий его индексу, с вашими флажками.
$options_arr = array_reverse( str_split( $options_bin, 1 ) ); //returns array containing "0,1,0,1"
Теперь заполните ваши флажки циклом. Предполагая, что флажки располагаются в том же порядке, что и сохраненные значения, и каждый из них имеет 2 ^ $ i.
for($i = 0; $i < sizeof($options_arr); ++$i) {
$checkbox_value = pow ( 2 , $i );
$checked_val = ( $options_arr[$i] ? 'checked' : '');
echo "<input type='checkbox' value='$checkbox_value' $checked_val />\n";
}
Не тестировался, так как я сделал свою версию на JavaScript.
Другим решением является получение опции прямо из двоичной строки
$checked_val = (boolean) substr( $options_bin , -($i+1), 1 );// +1 because neg substr counts from 1, not 0