我可以在表单输入中放置关联数组以在PHP中处理吗?

DLH*_*DLH 17 html php forms arrays drupal

我知道我可以做类似的事情<input name="foo[]">,但有可能做出类似的事情<input name="foo[bar]">并让它出现在PHP中$_POST['foo']['bar']吗?

我问的原因是因为我正在制作一个包含<select>多个表单元素的巨大表格(包括多个选项),并且我希望将我的数据清晰地组织在我正在发布的脚本中.我希望每列中的输入元素具有相同的基本名称,但是不同的行标识符作为数组键.那有意义吗?

编辑:我已经尝试过这个,但显然Drupal干扰了我正在尝试做的事情.我以为我的语法错了.萤火告诉我,我的名字输入构造完全一样,但我的数据回来为[foo[bar]] => data,而不是[foo] => array([bar] => data).

编辑2:似乎我的真正问题是我的假设,$form_state['values']在Drupal中将具有相同的数组层次结构$_POST.我永远不应该认为Drupal会那么合理和直观.我为浪费你的时间而道歉.你可以开展你的业务.

小智 24

假设我们想使用以下表格打印学生分数:

<form action="" method="POST">
  <input name="student['john']">
  <input name="student['kofi']">
  <input name="student['kwame']">
  <input type="submit" name="submit">
</form>
Run Code Online (Sandbox Code Playgroud)

和PHP代码打印他们的分数:

if(isset($_POST['submit']))
{
    echo $_POST['student']['john'] . '<br />';
    echo $_POST['student']['kofi'] . '<br />';
    echo $_POST['student']['kwame'] . '<br />'; 
}
Run Code Online (Sandbox Code Playgroud)

这将打印您输入到字段中的值.


Nea*_*eal 7

是的你可以.你甚至可以做name="foor[bar][]"更多的填充.


Mac*_*zaj 5

你也可以很容易地在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;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您在MYMODULE_form_submit($ form,&$ form_state)中print_r()$ form_state ['values'],您将看到如下内容:

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
)
Run Code Online (Sandbox Code Playgroud)