按类型迭代set $ _POST变量?

时间:2012-12-12 23:40:15

标签: php

我有如下用户输入:

<form action="special.php" method="post">
    <input name="first1"> <input name="last1"> <input name="age1">
    <input name="first2"> <input name="last2"> <input name="age2">
    <input name="first3"> <input name="last3"> <input name="age3">
    <input name="first4"> <input name="last4"> <input name="age4">
    <input name="first5"> <input name="last5"> <input name="age5">
    <input name="first6"> <input name="last6"> <input name="age6">
    ...

    N
</form>

表单中的用户输入量由用户决定;意思是,用户可以在上面的代码中添加5,10,20个额外的行,在它们适合时创建新的输入元素(遵循上面的模式)。

我的问题是,一旦表单被提交,迭代和打印出所有SET POST变量的简单方法是什么?

类似的东西:

for($i=0; $i < $numPostVars; $i++){
   if(isset($_POST['first".$i."'])){
       //echo all first names post variables that are set
    }
}

// do the same from last names & age in separate loops

2 个答案:

答案 0 :(得分:4)

我认为诀窍是将变量命名略有不同,并利用PHP的功能,将其作为数组解包。只需使用语法:first[1]。然后在PHP中,$ _POST ['first'] ['1']就是你会找到它的地方。然后,您可以使用

迭代所有“第一个”输入
foreach($_POST['first'] as $first_input) {
  // ... 
}

另请注意浏览器may not send the field,如果用户提交时为空。

以下是HTML中输入的内容:

<input name="first[1]"> <input name="last[1]"> <input name="age[1]">

正如用户@DaveRandom所指出的那样,还要考虑更多层次结构(比如你的数据库中的“行”):

<input name="people[1][first]"> <input name="people[1][last]"> <input name="people[1][age]">

答案 1 :(得分:2)

输入可以被视为数组,其语法与PHP中使用的语法非常相似:

<input name="name[1]" value="value 1">
<input name="name[2]" value="value 2">

这会产生$_POST['name'],如下所示:

array(
  1 => "value 1",
  2 => "value 2"
);

该原理可以扩展为包含多维和关联数组。因此,如果您要将输入命名为:

<input name="rows[1][first]"> <input name="rows[1][last]"> <input name="rows[1][age]">
<input name="rows[2][first]"> <input name="rows[2][last]"> <input name="rows[2][age]">

...您可以使用$_POST['rows']构造轻松迭代foreach。数据结构与一组数据库结果非常相似。

foreach ($_POST['rows'] as $row) {
  // do stuff with $row['first'], $row['last'] and $row['age'] here
}

有几点需要注意:

  • 与PHP不同,HTML中的关联数组键不需要引号,使用它们会产生您可能不期望的结果。它将工作,但不会以你想象的方式。你仍然需要在PHP中使用引号。
  • 据我所知,这种语法不是W3C标准。但是,PHP总是按预期处理它。