テーブルのように見え、同じ繰り返し行が何度も出力されるフォームを生成する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()