构建表单以将 $_POST 变量排序为数组


Structuring a form to sort $_POST variables into arrays

这个问题有头脑空白,所以如果答案有点简单,我深表歉意。我有一个表格,用户可以"添加"额外的行。我可以让它完美克隆,但我需要它做的是将每一行捕获为一个数组。

示例表:

<table>
<tr>
<td><input name="rowNum[]" type="text" value="1"></td>
<td><input name="stuff" type="text"></td>
<td><input name="morestuff" type="text"></td>
</tr>
<tr>
<td><input name="rowNum[]" type="text" value="2"></td>
<td><input name="stuff" type="text"></td>
<td><input name="morestuff" type="text"></td>
</tr>
</table>

期望的结果:

$_POST[rowNum] = array(
    1 => array(
        stuff => valueA, 
        morestuff => valueB), 
    2 => array(
        stuff => valueC, 
        morestuff => valueD)
    );

为每个项目使用 [ ] 会将它们放在单独的数组中,我不确定您如何以这种方式将它们正确地连接在一起,所以如果有人可以提供帮助,那就太好了!

试试这个:

<tr>
<td><input name="rowNum[1][stuff]" type="text"></td>
<td><input name="rowNum[1][morestuff]" type="text"></td>
</tr>
<tr>
<td><input name="rowNum[2][stuff]" type="text"></td>
<td><input name="rowNum[2][morestuff]" type="text"></td>
</tr>

请注意第 2 个和第 3 个输入名称周围的rowNum[x][]。您在问题中列出的第一个输入不是必需的。

执行此操作的正常方法是在每个之后放置[]

<tr>
<td><input name="rowNum[]" type="text" value="1"></td>
<td><input name="stuff[]" type="text"></td>
<td><input name="morestuff[]" type="text"></td>
</tr>

在 PHP 中,您可以将它们链接在一起,因为同一行中的所有输入都具有相同的索引。您可以一次循环所有这些:

foreach ($_POST['rownum'] AS $i => $rownum) {
    $stuff = $_POST['stuff'][$i];
    $morestuff = $_POST['morestuff'][$i];
    ...
}

注意:这不适用于复选框输入。浏览器仅发送复选框,因此它们将与所有其他输入不同步。但是您没有任何复选框,因此这不会成为问题。复选框的解决方案是在输入的值中放入一些内容,将其链接到相应的行。

另一个适用于复选框的解决方案是在所有字段中输入 ID:

<tr>
<td><input name="rowNum[1]" type="text" value="1"></td>
<td><input name="stuff[1]" type="text"></td>
<td><input name="morestuff[1]" type="text"></td>
<td><input name="checked[1]" type=checkbox></td>
</tr>
<tr>
<td><input name="rowNum[2]" type="text" value="2"></td>
<td><input name="stuff[2]" type="text"></td>
<td><input name="morestuff[2]" type="text"></td>
<td><input name="checked[2]" type=checkbox></td>
</tr>

它仍然不会提交未选中的框,但所有索引仍将同步。您可以测试if (isset($_POST['checked'][$i]))以判断是否选中了相应的框。

怎么样

<td><input name="1[stuff]" type="text"></td>
<td><input name="1[morestuff]" type="text"></td>
</tr>
<tr>
<td><input name="2[stuff]" type="text"></td>
<td><input name="2[morestuff]" type="text"></td>