У меня возникла проблема с отправкой данных в виде массива массива. Вот как я хочу, чтобы мои данные были 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]">
даст тот же результат в вашем массиве сообщений.