Как разместить данные в виде индексированного массива массивов (без указания индексов) - PullRequest
7 голосов
/ 20 мая 2011

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

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) если нет, как я могу динамически изменить новое поле ввода, чтобы у него было обновленное имя с новым индексом?

РЕДАКТИРОВАТЬ - я уже пытался использовать name="someName[value][]" и name="someName[description][]", но вывод не желаемый:

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

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

Ответы [ 2 ]

7 голосов
/ 20 мая 2011

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

<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>
4 голосов
/ 20 мая 2011

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

<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]">

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...