【问题标题】:How to POST data as an indexed array of arrays (without specifying indexes)如何将数据发布为数组的索引数组(不指定索引)
【发布时间】:2011-08-29 15:59:21
【问题描述】:

我在将数据作为数组发布时遇到了一些问题。这就是我希望我的数据发布的方式:

array(
['someName'] =>
array([0] =>
      array(['description'] =>890
            ['valore'] =>444)
      [1] =>
      array(['description'] =>98090
            ['value'] =>77)
) 

如果我的 html 是这样的,我知道我可以做到这一点:

<input type='text' name="someName[0][value]">
<input type='text' name="someName[0][description]">
<input type='text' name="someName[1][value]">
<input type='text' name="someName[1][description]">

我的问题是输入字段位于表的行上,用户可以根据需要添加/删除任意数量的行,所以我不能有固定索引(或者我必须修改输入字段的名称每次添加一行,因为每次我添加一行时,我都会克隆表中的上一行)

所以我要问的是这两件事之一:

1) 有没有办法在不指定索引的情况下按照我想要的方式发布数据

2)如果没有,我如何动态修改新的输入字段,以便它们具有带有新索引的更新名称?

编辑 - 我已经尝试使用 name="someName[value][]"name="someName[description][]" 但输出不是所需的:

array(['terreniOneri'] =>
       array(['descrizione'] =>array([0] =>890
                                      [1] => 98090)
               ['valore'] =>array([0] =>444
                                  [1] =>677)
      ) 

我知道我可以在 php 中迭代这个数组我只是想知道我是否可以避免它。

【问题讨论】:

  • 评论因为没有时间提供全面的答案:您可以在变量中生成模板行而不是复制顶行(例如var template='&lt;tr&gt;&lt;td&gt;&lt;input name=someName[%%ROWNUM%%][description]&gt;...&lt;/td&gt;&lt;/tr&gt;,然后用下一个索引替换所有出现的%%ROWNUM%%您想要(您必须跟踪您的计数)。然后使用 jquery 将其构建为 HTML 并将其添加到表格的末尾。
  • @chris 我需要克隆该行,因为“someName”可能因行而异,因此我无法对其进行硬编码。我应该做的(但我不知道该怎么做)是在新行中更改名称中的索引(只是数字)(这样如果我在原始行中有 someName[1][description] , 副本有 someName[2][description]) 如你所指,减法没问题!
  • 好吧,你也可以让“someName”成为模板变量,或者为不同的目的存储不同的模板,等等。一旦你使用了 javascript,你应该能够做任何你想做的事情。跨度>

标签: php jquery html post


【解决方案1】:

按照您提出问题的方式进行。如果用户删除了某行,您的表单元素将是:

<form action="..." method="post" onsubmit="return reindexer(this);">
    <input type='text' name="someName[0][value]">
    <input type='text' name="someName[0][description]">
    <input type='text' name="someName[2][value]">
    <input type='text' name="someName[2][description]">
</form>

但是在php中遍历具有非连续数字索引的数组没有问题:使用foreach循环。

<?php
if (count($_POST['somename']) > 0)
{
    foreach ($_POST['somename'] as $row)
    {
        echo "Value: ".$row['value']."<br />\n";
        echo "Description: ".$row['description']."<br />\n";
    }
}

如果您需要知道每行的数量作为连续索引(在提供的示例中,第 0 行仍为 0,但第 2 行应为 1(因为用户删除了一行),您可以使用变量充当计数器:

<?php
if (count($_POST['somename']) > 0)
{
    $i = 0;
    foreach ($_POST['somename'] as $row)
    {
        echo "Index $i<br />\n";
        echo "Value: ".$row['value']."<br />\n";
        echo "Description: ".$row['description']."<br />\n";
        $i++;
    }
}

我认为这种方法比其他解决方案更有意义,因为这样你会有一个项目数组,每个项目都有一个值和一个描述,而不是有两个单独的值和描述数组,并且必须获取您的项目的值来自这两个数组而不是一个。

编辑:我修改了第一段代码以包含&lt;form&gt; 元素。这将是随附的 js 函数:

<script type="text/javascript">
function reindexer(frm)
{
    var counter = 0;
    var inputsPerRow = 2;
    for (var idx = 0; idx < frm.elements.length; idx++)
    {
        elm.name = elm.name.replace('%%INDEX%%', counter);
        if (idx % inputsPerRow == 1)
        {
            // only increment the counter (or row number) after you've processed all the
            // inputs from each row
            counter++;
        }
    }
}
</script>

【讨论】:

  • 问题是当用户添加一行时(那是因为我克隆了上面一行):在这种情况下,新行将与旧行同名,并在发布时覆盖它跨度>
  • 当你添加一行时,它会被附加到表的末尾,或者两个现有的行之间?
  • 现有行之间。而且我必须克隆它,因为表的行之间的“somename”会发生变化
  • 那么我会选择 Chris 在问题中的评论。一开始,在用户克隆任何行之前,您的所有行都将字符串“%%INDEX%%”作为索引(name="somename[%%INDEX%%][value])。您捕获表单的 onsubmit 事件,然后对于表单中的每个 input,将 %%INDEX%% 替换为计数器。这种方法的缺点是,如果某些用户禁用了 js(我们存在),您的代码将只处理最后一行(因为每一行都会覆盖前一行(所有行都将具有相同的索引)。
  • @Carlos:当然缺点就是无法添加新行?如果 js 不能用于重命名索引,那么它就不能用于添加新行。
【解决方案2】:

试试这样:

<input type='text' name="someNameValue[]">
<input type='text' name="someNameDescription[]">

如果字段是成对的,它们可以通过索引附加。因此,如果您有第 10 行,则 someNameValue[9] 和 someNameDescription[9] 将是一对。您可以合并它们。

编辑: 您不必手动编写索引,它们会自动生成。

<input type='text' name="someName[]">
<input type='text' name="someName[]">
<input type='text' name="someName[]">

<input type='text' name="someName[0]">
<input type='text' name="someName[1]">
<input type='text' name="someName[2]">

将在您的帖子数组中给出相同的结果。

【讨论】:

  • 除了使用someName['value'][]someName['description'][] 之外,我会这样做。然后你可以通过几行 php 把它变成你想要的数组。
  • HTML 规范是否真的保证 POST 的元素会以明确定义的顺序发布(例如 HTML 中的位置)?尽管这可能会起作用,但依赖它感觉有点不对劲(尽管我可能错了,并且明确定义了它们传递的顺序)。
  • 嗯...我想是的。我以前用过很多次,从来没有遇到过任何问题。
  • 如果我这样做 someNameValue[]someNameDexcription[] 显然我有两个不同的数组,这不是我想要的。如果我这样做 someName['value'][]someName['description'][] 这是我尝试过的,但它没有给出我想要的(我会在输出上方发布)
  • 那么最好的选择是根据行号用JS生成索引。
猜你喜欢
  • 2020-08-19
  • 1970-01-01
  • 2023-03-09
  • 2012-01-03
  • 2021-12-25
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多