我知道我可以做<input name="foo[]">
这样的事情,但有可能做<input name="foo[bar]">
这样的事情并在PHP中显示为$_POST['foo']['bar']
吗?
我之所以这么问,是因为我正在制作一个表单元素的大表(包括具有多项选择的<select>
),并且我希望为我要发布到的脚本干净地组织我的数据。我希望每列中的输入元素具有相同的基名称,但具有不同的行标识符作为数组键。这有道理吗
编辑:我已经试过了,但显然Drupal干扰了我的操作。我以为我只是语法错误了。Firebug告诉我,我的输入名称是这样构造的,但我的数据返回为[foo[bar]] => data
而不是[foo] => array([bar] => data)
。
EDIT 2:我真正的问题似乎是我假设Drupal中的$form_state['values']
与$_POST
具有相同的数组层次结构。我从来没有想过Drupal会如此合理和直观。很抱歉浪费了你的时间。你可以去做你的事了。
假设我们想使用以下表格打印学生成绩:
<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 />';
}
这将打印您在字段中输入的值。
可以。您甚至可以执行name="foor[bar][]"
及以上操作以获得更多填充。
您也可以在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,&$form_state)中打印_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
)
回答为时已晚,但重要的是要突出@Ernest Boabramah回答的一个方面。
如果您将输入数据作为数组发送,其中引号内有关键字,如下所示
<input name="student['john']">
<input name="student['kofi']">
然后,在访问php中的值时,必须转义键周围的引号
echo $_POST['student']['''john'''];
echo $_POST['student']['''kofi''']
我建议你删除钥匙周围的引号
<input name="student[john]">
<input name="student[kofi]">
这样你就可以在不逃避任何的情况下访问它们
echo $_POST['student']['john'];
echo $_POST['student']['kofi'];