我在将数据作为数组数组发布时遇到了一些问题。这就是我希望我的数据发布的方式:
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中迭代这个数组我只是想知道我是否可以避免它。
答案 0 :(得分:7)
按照你提出的问题的方式来做。如果用户删除了某些行,则表单元素为:
<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++;
}
}
我认为这种方法比其他解决方案更有意义,因为这样你就会有一个项目数组,每个项目都是一个值和一个描述,而不是有两个独立的值和描述数组,必须得到来自这两个数组而不是一个数组的项目值。
编辑:我修改了第一段代码以包含<form>
元素。这将是伴随的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>
答案 1 :(得分:4)
试试这样:
<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]">
会在你的帖子数组中给出相同的结果。