Php 如何将数据发布为数组的索引数组(不指定索引)

Php 如何将数据发布为数组的索引数组(不指定索引),php,jquery,html,post,Php,Jquery,Html,Post,我在以数组的数组形式发布数据时遇到一些问题。以下是我希望发布数据的方式: array( ['someName'] => array([0] => array(['description'] =>890 ['valore'] =>444) [1] => array(['description'] =>98090 ['value'] =>77) ) 我知道如果我的html

我在以数组的数组形式发布数据时遇到一些问题。以下是我希望发布数据的方式:

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]">
<input type='text' name="someNameValue[]">
<input type='text' name="someNameDescription[]">
我知道我可以用php迭代这个数组,我只是想知道我是否可以避免它。

像这样尝试:

<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]">
<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[]">



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

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

<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>
如果需要知道作为连续索引的每一行的编号(在提供的示例中,第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++;
    }
}

除了使用
someName['value'][]
someName['description']][]
之外,我会用同样的方法来实现。然后,您可以通过几行php将其转换为所需的数组。HTML规范是否真的保证发布的元素将以定义良好的顺序(例如HTML中的位置)发布?虽然这可能会起作用,但依靠它感觉有点不对劲(尽管我可能是错的,它很好地定义了它们的传递顺序)。嗯……我想是的。我以前使用过很多次,从来没有遇到过任何问题。如果我使用
someNameValue[]
SomeNameDescription[]
显然,我有两个不同的数组,这不是我想要的。如果我做了
someName['value'][
someName['description'][
这是我尝试过的,但没有达到我想要的效果(我将在输出上方发布)然后,最好的选择是根据行号使用JS生成索引。由于没有时间给出全面的答案,因此进行评论:您可以在变量中生成一个模板行(例如
var-template=”…
,然后用所需的下一个索引替换所有出现的
%%ROWNUM%%
(您必须跟踪您的计数)。然后使用jquery将其构建为HTML,并将其添加到表的末尾。@chris我需要克隆该行,因为“someName”可能因行而异,因此我无法对其进行硬编码。我应该做的(但我不知道如何做)是更改新行名称中的索引(只是数字)(因此,如果我在原始行中有someName[1][description],那么副本中就有someName[2][description])正如您所指出的,在进行减法时没有问题!您可以始终使用“someName”也可以使用一个模板变量,或者为不同的目的存储不同的模板,等等。一旦你使用javascript,你应该能够真正做任何你想做的事情。问题是当用户添加一行时(这是因为我克隆了上面的行):在这种情况下,新行将与旧行具有相同的名称,并且在发布时将覆盖它。当您添加一行时,它将附加在表的末尾,或者在两个现有行之间?在现有行之间。我必须克隆它,因为“somename”在表的行之间发生更改。然后,我将在q中使用类似Chris的注释uestion.在开始时,在用户克隆任何行之前,您的所有行都将字符串“%%INDEX%%”作为索引(
name=“somename[%%INDEX%%]”[value]
)。您捕获表单的
onsubmit
事件,然后对于表单中的每个
input
,将%%INDEX%%替换为计数器。这种方法的缺点是,如果某些用户禁用了js(我们存在),您的代码将只处理最后一行(因为每一行都会覆盖上一行(所有行都有相同的索引)@Carlos:当然,缺点就是无法添加新行?如果js不能重命名索引,那么它就不能添加新行。
<?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++;
    }
}
<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>