组织具有类似表格的批量数据的$ _POST输入

时间:2012-07-09 08:31:30

标签: php arrays forms parsing optimization

考虑一个生成表单的PHP脚本,该表单看起来像一个表,并且多次输出相同的重复行:

Image of the example form generated by the snippet.

print('<form method="POST" action="index.php">
    <table>
    <tr>
       <th>Row #</th>
       <th><tt>name</tt></th>
       <th><tt>value</tt></th>
    </tr>');

for ( $i = 1; $i <= 4; $i++ )
{
    print('<tr>
        <th>' .$i. '</th>
        <td><input type="text" name="name_' .$i. '" size="20"></td>
        <td><input type="text" name="value_' .$i. '" size="4"></td>
    </tr>');
}

print('</table>
      <input type="submit" name="is_submit" value="Submit">
</form>');

提交此表单时,$_POST数组将如下所示:

array (
  'name_1',
  'value_1',
  'name_2',
  'value_2',
  'name_3',
  'value_3',
  'name_4',
  'value_4',
  'is_submit',
);

我想做什么,它组织这个输入所以它看起来像这样:

array (
  1 => 
  array (
    'name',
    'value',
  ),
  2 => 
  array (
    'name',
    'value',
  ),
  3 => 
  array (
    'name',
    'value',
  ),
  4 => 
  array (
    'name',
    'value',
  ),
);

这意味着,以相同的行ID 编号结尾的每个字段与两个深层数组中的其他字段(在同一行中)组合在一起。

我一直在用解决方案来解决这个问题,并提出了以下“解决方案”(有组织的数组(上图)实际上是这种方法创建的$output的转储):

if ( array_key_exists('is_submit', $_POST) ) // Form is submitted properly
{
    unset($_POST['is_submit']); // Drop the status key

    foreach ( array_keys($_POST) as $key )
    {
        $key_exploded = explode("_", $key); // [0] is key 'basename', [1] is the 'row ID'
        $output[ $key_exploded[1] ][ $key_exploded[0] ] = $_POST[$key];
    }
}

最大的问题是这种方法看起来有点混淆和硬编码。我想并希望周围更高级的人可以指导我更具动态性(unset行很痒,我需要在每个非表行上调用unset())和更好的方法

2 个答案:

答案 0 :(得分:5)

更改这些行:

<td><input type="text" name="name_' .$i. '" size="20"></td>
<td><input type="text" name="value_' .$i. '" size="4"></td>

<td><input type="text" name="foobar['.$i.'][name]" size="20"></td>
<td><input type="text" name="foobar['.$i.'][value]" size="4"></td>

$ _ POST ['foobar']现在将具有所需的结构。

答案 1 :(得分:0)

如果您不想更改表单,可以在foreach循环中引入其他条件:

if ( array_key_exists('is_submit', $_POST) ) // Form is submitted properly
{
    foreach ( array_keys($_POST) as $key )
    {
        $key_exploded = explode("_", $key); // [0] is key 'basename', [1] is the 'row ID'

        // check if keys start with 'name' or 'value'
        if ($key_exploded[0] == 'name' || $key_exploded[0] == 'value')
            $output[ $key_exploded[1] ][ $key_exploded[0] ] = $_POST[$key];
    }
}