サーバー側の言語としてPHPを使用している場合は、次のように実行できます。
<div class="clone_block">
Name: <input type="text" name="items[][name]" /><br />
Amount: <input type="text" name="items[][amount]" /><br />
<button class="delete">Delete</button>
</div>
PHPは、データを受信すると、適切なオフセットインデックスの作成を自動的に処理します。
ただし、質問に答えるには、ブロックのクローンを作成したら、その構造をナビゲートし、名前の属性を番号を増やして変更するだけです。または、すべての入力をナビゲートし、追加または削除ボタンが使用されるたびにそれらのインデックスを再作成することをお勧めします...これにより、削除が可能になります。
/// find each row with inputs
$('div.form_row').each(function(rowIndex){
/// find each input with a name attribute inside each row
$(this).find('input[name]').each(function(){
var name;
name = $(this).attr('name');
name = name.replace(/\[[0-9]+\]/g, '['+rowIndex+']');
$(this).attr('name',name);
});
});
上記は次のマークアップで機能します(そしてテストされています)。インデックスが並べ替えられるのを確認する必要があります。
<div class="form_row"><input name="something[0][abc]"></div>
<div class="form_row"><input name="something[2][abc]"></div>
<div class="form_row"><input name="something[3][abc]"></div>
修正!
PHPを使用してインデックスを生成する際のバグに気づきました...インデックスが配列構造の最後の部分である場合は機能します。
something[abc][]
something[def][]
しかし、あなたが(あなたがそうであるように)使用している場合:
something[][abc]
something[][def]
最終的には次のPHP側になります。
array (
'0' => array( 'abc' => 'value' ),
'1' => array( 'def' => 'value' ),
)
それよりも:
array (
'0' => array(
'abc' => 'value',
'def' => 'value',
),
);
おそらくどちらがあなたが望むものです。したがって、あなたの例では、私が言及したPHPルートを無視し、代わりにjQueryスニペットを使用します。ただし、行ごとに入力が1つしかない場合でも、PHPソリューションは便利です...