1

テーブルのように見え、同じ繰り返し行が何度も出力されるフォームを生成するPHPスクリプトについて考えてみます。

スニペットによって生成されたサンプルフォームの画像。

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番号で終わるすべてのフィールドが、2レベルの深い配列で(同じ行の)他のフィールドと一緒にグループ化されることを意味します。

私はこれを解決するためのオプションを落書きして、次の「解決策」を思いつきました(組織化された配列(上記)は実際には$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()

4

2 に答える 2

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']は目的の構造になります。

于 2012-07-09T08:38:20.540 に答える
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];
    }
}
于 2012-07-09T08:44:44.623 に答える