Могу ли я помещать ассоциативные массивы в формы ввода для обработки на PHP?
Я знаю, что могу делать такие вещи, как <input name="foo[]">
, но можно ли делать такие вещи, как <input name="foo[bar]">
и показать его в PHP как $_POST['foo']['bar']
?
Причина, по которой я спрашиваю, состоит в том, что я создаю огромную таблицу элементов формы (включая <select>
с несколькими <select>
), и я хочу, чтобы мои данные были организованы для сценария, к которому я отправляю POSTING. Я хочу, чтобы элементы ввода в каждом столбце имели одно и то же базовое имя, но другой идентификатор строки в качестве ключа массива. Имеет ли это смысл?
EDIT: Я уже пытался это сделать, но, по-видимому, Drupal вмешивается в то, что я пытаюсь сделать. Я думал, что я просто неправильно понял свой синтаксис. Firebug сообщает мне, что мои имена ввода построены точно так же, но мои данные возвращаются как [foo[bar]] => data
а не [foo] => array([bar] => data)
.
EDIT 2: Кажется, моя реальная проблема заключалась в моем предположении, что $form_state['values']
в Drupal будет иметь такую же иерархию массивов, что и $_POST
. Я никогда не должен был предполагать, что Drupal будет настолько разумным и интуитивным. Прошу прощения за то, что потратил ваше время. Вы можете заниматься своим бизнесом.
Ответы
Ответ 1
Вы тоже можете сделать это в Drupal, довольно легко. Важная вещь, о которой вы должны помнить, это установить параметр '#tree' в значение TRUE. Чтобы дать вам быстрый пример:
function MYMODULE_form() {
$form = array('#tree' => TRUE);
$form['group_1']['field_1'] = array(
'#type' => 'textfield',
'#title' => 'Field 1',
);
$form['group_1']['field_2'] = array(
'#type' => 'textfield',
'#title' => 'Field 2',
);
$form['group_2']['field_3'] = array(
'#type' => 'textfield',
'#title' => 'Field 3',
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Submit',
);
return $form;
}
Теперь, если вы напечатаете_r() $ form_state ['values'] в MYMODULE_form_submit ($ form, & $ form_state), вы увидите что-то вроде этого:
Array
(
[group_1] => Array
(
[field_1] => abcd
[field_2] => efgh
)
[group_2] => Array
(
[field_3] => ijkl
)
[op] => Submit
[submit] => Submit
[form_build_id] => form-7a870f2ffdd231d9f76f033f4863648d
[form_id] => test_form
)
Ответ 2
Скажем, мы хотим напечатать студенческие баллы, используя форму ниже:
<form action="" method="POST">
<input name="student['john']">
<input name="student['kofi']">
<input name="student['kwame']">
<input type="submit" name="submit">
</form>
и PHP-код для печати своих баллов:
if(isset($_POST['submit']))
{
echo $_POST['student']['john'] . '<br />';
echo $_POST['student']['kofi'] . '<br />';
echo $_POST['student']['kwame'] . '<br />';
}
Это напечатает значения, введенные вами в поле.
Ответ 3
Да, ты можешь. вы можете даже сделать name="foor[bar][]"
и дальше для еще большего заполнения.