【问题标题】:How to create an array of a group of items inside an HTML form如何在 HTML 表单中创建一组项目的数组
【发布时间】:2010-11-04 20:03:51
【问题描述】:

我正在尝试按照以下内容创建一个表单(我知道这不是有效的 HTML,但它希望能说明我尝试这样做的内容和原因):

<form method="post" action="test.php">
    <input type="text" name="teamName">
    <br />Players:
    <grouping name="players[]">
        <input type="text" name="firstName"><br />
        <input type="text" name="lastName"><br />
    </grouping>
    <input type="submit" value="submit">
</form>

通过 javascript,我会根据需要多次添加分组元素。提交表单后,我可以访问分组元素中的项目,如下所示:

foreach ($players as $player) {
    $fName = $player->firstName;
    $lName = $player->lastName;
}

也就是说,在我开始之前,我不知道球队会有多少球员,但我知道球员长什么样。我想将这一切都保留在一个屏幕上,以便用户可以在一个页面上将球员添加到他们的团队中,并且我希望能够将字段分组添加为一个组。但是,我还希望将该分组存储为数组,而不是执行以下操作:

<form method="post" action="test.php">
    <input type="text" name="teamName">
    <br />Players:
    <input type="text" name="firstName[]"><br />
    <input type="text" name="lastName[]"><br />
    <input type="submit" value="submit">
</form>

这意味着我可以遍历分组中的各个元素,但不能遍历整个分组。

我有什么想法可以做到这一点吗?

【问题讨论】:

    标签: html forms


    【解决方案1】:

    不过,看看您的结构,我建议您使用更健壮的数组结构:

    foreach ($players as $i => $player) {
        $fName = $player->firstName;
        $lName = $player->lastName;
    
        echo '<input type="text" name="players['.$i.'][firstName]" value="'.$fName.'" />';
        echo '<input type="text" name="players['.$i.'][lastName]" value="'.$lName .'" />';
    
    }
    

    提交后,您将获得:

    players => Array(
      [0] => Array (
        firstName => a name,
        lastName => another name,
      ),
      [1] => Array (
        firstName => a name,
        lastName => another name,
      ),
    etc...
    )
    

    或者,您可以在最后一个输入字段中执行递增的 $i++,而不是在 foreach 语句中生成 $i,但我发现出于调试目的,通常很高兴知道您使用原始数组中的哪个索引。

    我在您的问题示例中推荐这种方法,因为它还允许您通过 $_POST['players'] 进行计数/迭代

    希望对你有帮助

    【讨论】:

    • 如果我只是做了类似 name="players[][firstName]" 和 name="players[][lastname]" 之类的事情,这行得通吗?
    • 人力资源部。刚刚意识到这是我的第一个 stackoverflow 答案......哇。没想到我是这样的潜伏者。感谢您发布有关该问题的推文并促使我采取行动。
    • 不,你实际上是在做玩家[0][名字]和玩家[1][姓]。 [] 的每个实例都会增加数组指针。
    • 刚刚意识到这一点。呃。虽然越来越接近答案。你提出的肯定会奏效,但我不确定如何动态添加组 - 我的 javascript 怎么知道已经创建了多少组?
    【解决方案2】:

    这听起来像是一份工作:&lt;fieldset&gt;

    将您的 &lt;input&gt; 元素包装在 &lt;fieldset&gt; 元素中,并可能为该字段集提供一个 ID、一些类或您想要的任何内容。

    然后确保输入名称使用正确的数组结构:

    players[NUMBER][firstName]players[NUMBER][lastName] 应该可以正常工作(NUMBER 当然会被索引替换)。

    不要忘记为您的&lt;input&gt; 元素提供&lt;label&gt; 以方便访问。 给&lt;fieldset&gt; 一个&lt;legend&gt; 也是一个好主意。

    【讨论】:

    • 问题不在于如何对元素进行分组,而在于如何避免将该数字编码到字段名称中。编写像 player[][firstName] 这样的东西是我想要做的,除了会为每个字段创建一个新的数组元素。编写像 player[firstName][] 这样的东西会自动创建适当的索引号,但会涉及以一种奇怪的方式进行迭代。
    • 是的,我还没有找到避免手动指定数字的方法。
    【解决方案3】:

    解决这个问题的多种方法:

    1) 在循环之外创建一个计数器$i = 0,在循环内部创建一个$i++。而不是命名firstName[] 使用firstName[&lt;?php echo $i; ?&gt;]

    2) 如果它实际上只是第一个和第二个名称 - 您可以使用单个 &lt;input&gt; 然后在 php 中解析它。

    祝你好运

    【讨论】:

    • 实际上大约有十几个字段、一些文本、一些数字和一个日期。解析单个输入字段不会真正起作用。这些字段将使用 Javascript 动态添加到表单中,它可能知道也可能不知道有多少此类字段已添加到屏幕中。不过感谢您的帮助和建议
    • php 相关注意事项:在 php 中预递增变量比后递增稍快(这仅适用于 php)。而不是 $i++,选择 ++$i。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多