¿Cómo puedo usar los nombres de campo de entrada de formato de matriz en mi formulario HTML que se publica en PHP?

Entiendo los conceptos básicos del uso de los nombres de entrada HTML con formato de matriz. Si tuviera un formulario con un número variable de entradas de 'elementos', podría hacer algo como esto para cada uno de ellos:

<input name='item[]' type='text' />

Y cuando recupero los elementos de la matriz $ _POST, podría iterar sobre ellos de la siguiente manera:

$items = $_POST['item'];
foreach($items as $item) {
}

Pero mi pregunta es un poco más complicada. Tengo un formulario donde los usuarios pueden hacer clic en el botón "agregar uno" y aparecerá una nueva fila en el número inferior del formulario. Cada nueva fila contiene una entrada de 'nombre' y 'descripción'.

Así que inicialmente pensé que haría esto:

<input name='item[name][]' type='text' />
<input name='item[description][]' type='text' />

Y luego iterar sobre ellos así:

$items = $_POST['item'];
foreach($items as $item) {
  print $item['name'] . ' ' . $item['description'];
}

Pero en lugar de funcionar como esperaba, en su lugar estructura la matriz 'item' de modo que acceda al primer nombre del elemento como$item['name'][0] en lugar de como$item[0]['name'].

Entonces lo volteé para que mis entradas se nombraran así:

<input name='item[][name]' type='text' />
<input name='item[][description]' type='text' />

Pero esto resultó en un 'elemento' separado para cada 'nombre' y para cada 'descripción' en lugar de agrupar cada par en un solo 'elemento'.

Realmente no me gusta tener matrices de 'nombre' y una matriz separada de 'descripción'. Preferiría matrices de 'elemento' con cada matriz que contiene un campo 'nombre' y 'descripción'. ¿Hay alguna manera de lograr esto sin generar un índice en mi javascript? Dado que las personas pueden agregarlos y eliminarlos dinámicamente, es muy difícil para mi javascript calcular el índice apropiado para el siguiente elemento. ¿No hay forma de hacer esto genéricamente?

Respuestas a la pregunta(1)

Su respuesta a la pregunta