PHP: получение значения флажков, когда имя не имеет массива

Форма, в которой я не контролирую, – это POSTing данные для моего PHP-скрипта. Форма содержит флажки в этих строках:

<input type="checkbox" value="val1" name="option"/> <input type="checkbox" value="val2" name="option"/> 

Если бы я написал код для формы, я бы name="option[]" вместо name="option" . Но это не изменение, которое я могу сделать. Теперь, если оба флажка отмечены, $_POST["option"] возвращает только одно из значений. Как я могу, в PHP получить все выбранные значения?

Вы можете прочитать исходные данные. Например:

 <fieldset> <legend>Data</legend> <?php $data = file_get_contents("php://input"); echo $data."<br />"; ?> </fieldset> <fieldset> <legend>Form</legend> <form method="post" action="formtest.php"> <input type="checkbox" value="val1" name="option"/><br /> <input type="checkbox" value="val2" name="option"/><br /> <input type="submit" /> </form> </fieldset> 

Проверьте оба поля и вывод:

 option=val1&option=val2 

Вот живая демонстрация . Все, что вам нужно сделать, это разобрать строку самостоятельно в подходящем формате. Вот пример функции, которая делает что-то вроде этого:

 function parse($data) { $pairs = explode("&", $data); // process all key/value pairs and count which keys // appear multiple times $keys = array(); foreach ($pairs as $pair) { list($k,$v) = explode("=", $pair); if (array_key_exists($k, $keys)) { $keys[$k]++; } else { $keys[$k] = 1; } } $output = array(); foreach ($pairs as $pair) { list($k,$v) = explode("=", $pair); // if there are more than a single value for this // key we initialize a subarray and add all the values if ($keys[$k] > 1) { if (!array_key_exists($k, $output)) { $output[$k] = array($v); } else { $output[$k][] = $v; } } // otherwise we just add them directly to the array else { $output[$k] = $v; } } return $output; } $data = "foo=bar&option=val1&option=val2"; print_r(parse($data)); 

Выходы:

 Array ( [foo] => bar [option] => Array ( [0] => val1 [1] => val2 ) ) 

Могут быть несколько случаев, когда эта функция работает не так, как ожидалось, поэтому будьте осторожны.