【问题标题】:Can I put associative arrays in form inputs to be processed in PHP?我可以将关联数组放入要在 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 会如此合理和直观。我为浪费您的时间而道歉。你可以去做你的事了。

【问题讨论】:

  • Posting array from form的可能重复
  • 奇怪,我试图做到这一点,但没有成功。我想这只是因为我使用的是 Drupal:/ 我以为我只是没有正确使用 PHP 语法。现在我不确定是否应该修改这个问题或写一个新的、特定于 Drupal 的问题。

标签: php html arrays drupal forms


【解决方案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][]" 来获得更多的填充。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2012-02-24
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      相关资源
      最近更新 更多