Как данные POST как индексированный массив массивов (без указания индексов)

У меня возникла проблема с отправкой данных в виде массива массива. Вот как я хочу, чтобы мои данные были POSTED:

array( ['someName'] => array([0] => array(['description'] =>890 ['valore'] =>444) [1] => array(['description'] =>98090 ['value'] =>77) ) 

Я знаю, что могу добиться этого, если мой html выглядит так:

 <input type='text' name="someName[0][value]"> <input type='text' name="someName[0][description]"> <input type='text' name="someName[1][value]"> <input type='text' name="someName[1][description]"> 

Моя проблема в том, что поля ввода находятся в строках таблицы, и пользователь может добавлять / удалять столько строк, сколько захочет, поэтому я не могу иметь фиксированный индекс (или мне нужно изменить имя полей ввода каждый раз, когда строка добавляется, так как каждый раз, когда я добавляю строку, я клонирую верхнюю строку в таблице)

Так что я спрашиваю, это одна из двух вещей:

1) есть способ опубликовать данные так, как я хочу, без указания индекса

2) если нет, то как я могу динамически изменять новое поле ввода, чтобы у них обновленное имя с новым индексом?

EDIT – у меня alredy попытался использовать name="someName[value][]" и name="someName[description][]" но результат не является желаемым:

 array(['terreniOneri'] => array(['descrizione'] =>array([0] =>890 [1] => 98090) ['valore'] =>array([0] =>444 [1] =>677) ) 

Я знаю, что могу перебирать этот массив в php. Мне просто интересно, могу ли я его избежать.

Сделайте это так, как вы задали вопрос. Если пользователь удаляет некоторую строку, ваши элементы формы будут:

 <form action="..." method="post" onsubmit="return reindexer(this);"> <input type='text' name="someName[0][value]"> <input type='text' name="someName[0][description]"> <input type='text' name="someName[2][value]"> <input type='text' name="someName[2][description]"> </form> 

Но нет никакой проблемы, чтобы пересечь массив с несмежными числовыми индексами в php: используйте цикл foreach .

 <?php if (count($_POST['somename']) > 0) { foreach ($_POST['somename'] as $row) { echo "Value: ".$row['value']."<br />\n"; echo "Description: ".$row['description']."<br />\n"; } } 

Если вам нужно знать количество каждой строки как непрерывный индекс (в приведенном примере строка 0 будет по-прежнему равна 0, но строка 2 должна быть 1 (поскольку пользователь удалил одну строку), вы можете использовать переменную, действующую как счетчик:

 <?php if (count($_POST['somename']) > 0) { $i = 0; foreach ($_POST['somename'] as $row) { echo "Index $i<br />\n"; echo "Value: ".$row['value']."<br />\n"; echo "Description: ".$row['description']."<br />\n"; $i++; } } 

Я думаю, что этот подход имеет больше смысла в том, что другие решения, так как таким образом у вас будет массив элементов, каждый элемент представляет собой значение и описание вместо двух отдельных массивов значений и описаний и должен получать значения для вашего элемент из этих двух массивов вместо одного.

edit: Я изменил первый фрагмент кода, чтобы включить элемент <form> . Это будет сопровождающая функция js:

 <script type="text/javascript"> function reindexer(frm) { var counter = 0; var inputsPerRow = 2; for (var idx = 0; idx < frm.elements.length; idx++) { elm.name = elm.name.replace('%%INDEX%%', counter); if (idx % inputsPerRow == 1) { // only increment the counter (or row number) after you've processed all the // inputs from each row counter++; } } } </script> 

Попробуйте вот так:

 <input type='text' name="someNameValue[]"> <input type='text' name="someNameDescription[]"> 

Если поля спарены, они могут быть привязаны индексами. Итак, если у вас есть 10-я строка, someNameValue [9] и someNameDescription [9] будут парой. Вы можете объединить их.

EDIT: вам не нужно писать индексы вручную, они будут автоматически сгенерированы.

 <input type='text' name="someName[]"> <input type='text' name="someName[]"> <input type='text' name="someName[]"> 

а также

 <input type='text' name="someName[0]"> <input type='text' name="someName[1]"> <input type='text' name="someName[2]"> 

даст тот же результат в вашем массиве сообщений.