How to POST data as an indexed array of arrays (without specifying indexes)

后端 未结 2 1132
傲寒
傲寒 2020-12-06 18:42

i\'m having some problem with posting data as an array of array. This is how i\'d like my data to be POSTED:

array(
[\'someName\'] =>
array([0] =>
             


        
相关标签:
2条回答
  • 2020-12-06 19:05

    Do it the way you put in the question. If the user removes some row, your form elements would be:

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

    But there's no problem to traverse an array with non-contiguous numeric indexes in php: use a foreach loop.

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

    If you need to know the number of each row as a continous index (in the example provided, row 0 would still be 0, but row 2 should be 1 (as the user deleted one row), you can use a variable acting as a counter:

    <?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++;
        }
    }
    

    I think this approach has more sense that the other solutions, as this way you would have an array of items, being each item a value and a description, instead of having two separate arrays of values and descriptions and having to get the values for your item from those two arrays instead of one.

    edit: I've modified the first piece of code to include the <form> element. This would be the accompanying js function:

    <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>
    
    0 讨论(0)
  • 2020-12-06 19:08

    Try like this:

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

    If the fields are paired, they can be attached by the indexes. So if you have the 10th row, someNameValue[9] and someNameDescription[9] will be a pair. You can merge them.

    EDIT: You don't have to write the indexes manually, they will be automatically generated.

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

    and

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

    will give the same result in your post array.

    0 讨论(0)
提交回复
热议问题