Могу ли я помещать ассоциативные массивы в формы ввода для обработки на 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][]" и дальше для еще большего заполнения.