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

时间:2011-06-24 14:15:53

标签: php html arrays drupal html-form

我知道我可以执行<input name="foo[]">之类的操作,但有可能执行<input name="foo[bar]">之类的操作并将其显示在PHP中$_POST['foo']['bar']吗?

我问的原因是因为我正在制作一个包含多个选择的<select>表单元素的巨大表格,并且我想让我的数据干净利落地组成我所用的脚本张贴到。我希望每列中的输入元素具有相同的基本名称,但是不同的行标识符作为数组键。这有意义吗?

编辑:我已经尝试了这一点,但显然Drupal干扰了我正在尝试做的事情。我以为我的语法错了。 Firebug告诉我,我的输入名称的构造与此完全相同,但我的数据以[foo[bar]] => data而不是[foo] => array([bar] => data)的形式返回。

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

3 个答案:

答案 0 :(得分:24)

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

<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 />'; 
}

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

答案 1 :(得分:7)

是的,你可以。你甚至可以name="foor[bar][]"进行更多填充。

答案 2 :(得分: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;
}

现在,如果您在MYMODULE_form_submit($ form,&amp; $ 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
)