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

Posted

技术标签:

【中文标题】我可以将关联数组放入要在 PHP 中处理的表单输入中吗?【英文标题】:Can I put associative arrays in form inputs to be processed in PHP? 【发布时间】:2011-09-22 01:57:09 【问题描述】:

我知道我可以执行<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 会如此合理和直观。我为浪费您的时间而道歉。你可以去做你的事了。

【问题讨论】:

手册上是这么写的php.net/manual/en/faq.html.php#faq.html.arrays Posting array from form的可能重复 奇怪,我试图做到这一点,但没有成功。我想这只是因为我使用的是 Drupal:/ 我以为我只是没有正确使用 PHP 语法。现在我不确定是否应该修改这个问题或写一个新的、特定于 Drupal 的问题。 【参考方案1】:

回答为时已晚,但强调@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']; 

【讨论】:

【参考方案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 />'; 

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

【讨论】:

我尝试了您的解决方案,但我想知道为什么我必须这样使用它:$_POST['student']['\'john\'']?我也以这样的形式使用它:&lt;input name="student[kofi]"&gt;【参考方案3】:

您也可以在 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) 中 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
)

【讨论】:

噢,我不知道#tree。我的表单数组的结构与此类似,但我不知道那里缺少一个额外的标志。谢谢!【参考方案4】:

是的,你可以。你甚至可以使用name="foor[bar][]" 来获得更多的填充。

【讨论】:

以上是关于我可以将关联数组放入要在 PHP 中处理的表单输入中吗?的主要内容,如果未能解决你的问题,请参考以下文章

PHP实现简单的文本提交表单(可放入图片)

使用 PHP 将 JSON 数据放入 html 表单输入复选框

比较 php MySQL 查询结果数组以从其中一个数组中获取关联值

如何将pdo返回的关联数组的内容放入数组中

创建对象或数组以处理多步表单

处理php中的新行