Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Submitting a multidimensional array via POST with php

I have a php form that has a known number of columns (ex. top diameter, bottom diameter, fabric, colour, quantity), but has an unknown number of rows, as users can add rows as they need.

I've discovered how to take each of the fields(columns) and place them into an array of their own.

<input name="topdiameter['+current+']" type="text" id="topdiameter'+current+'" size="5" />
<input name="bottomdiameter['+current+']" type="text" id="bottomdiameter'+current+'" size="5" />

So what I end up with in the HTML is:

<tr>
  <td><input name="topdiameter[0]" type="text" id="topdiameter0" size="5" /></td>
  <td><input name="bottomdiameter[0]" type="text" id="bottomdiameter0" size="5" /></td>
</tr>
<tr>
  <td><input name="topdiameter[1]" type="text" id="topdiameter1" size="5" /></td>
  <td><input name="bottomdiameter[1]" type="text" id="bottomdiameter1" size="5" /></td>
</tr>

...and so on.

What I would like to do now is take all the rows and columns put them into a multidimensional array and email the contents of that to the client (preferably in a nicely formatted table). I haven't been able to really comprehend how to combine all those inputs and selects into a nice array.

At this point, I'm going to have to try to use several 1D arrays, although I have the idea that using a single 2D array would be a better practice than using several 1D arrays.

like image 206
Fireflight Avatar asked Mar 12 '10 15:03

Fireflight


3 Answers

On submitting, you would get an array as if created like this:

$_POST['topdiameter'] = array( 'first value', 'second value' );
$_POST['bottomdiameter'] = array( 'first value', 'second value' );

However, I would suggest changing your form names to this format instead:

name="diameters[0][top]"
name="diameters[0][bottom]"
name="diameters[1][top]"
name="diameters[1][bottom]"
...

Using that format, it's much easier to loop through the values.

if ( isset( $_POST['diameters'] ) )
{
    echo '<table>';
    foreach ( $_POST['diameters'] as $diam )
    {
        // here you have access to $diam['top'] and $diam['bottom']
        echo '<tr>';
        echo '  <td>', $diam['top'], '</td>';
        echo '  <td>', $diam['bottom'], '</td>';
        echo '</tr>';
    }
    echo '</table>';
}
like image 114
DisgruntledGoat Avatar answered Sep 20 '22 15:09

DisgruntledGoat


you could submit all parameters with such naming:

params[0][topdiameter]
params[0][bottomdiameter]
params[1][topdiameter]
params[1][bottomdiameter]

then later you do something like this:

foreach ($_REQUEST['params'] as $item) {
    echo $item['topdiameter'];
    echo $item['bottomdiameter'];
}
like image 26
Laimoncijus Avatar answered Sep 20 '22 15:09

Laimoncijus


I know this is necro-posting, but I have been running to this same issue and ending up to this same answer many, many, many times, over some years.

Today though I had an additional issue, I wanted my users to be able to add as many items as they want, as well as rearrange their input before submitting, so I came up with this relatively clean solution:

$diameters = [];
foreach($_POST['diameters'] as $k=>$v){
 $val = intdiv($k,2);
 $diameters[$val][key($v)]=$v[key($v)];
}
$_POST['diameters']=$diameters;

The hard coded 2 is because that is the size of the input block (topdiameter, bottomdiameter)

So the html can simply look like this:

<tr>
  <td><input name="diameters[][top]" type="text" [..] /></td>
  <td><input name="diameters[][bottom]" type="text" [..] /></td>
</tr>
<tr>
  <td><input name="diameters[][top]" type="text" [..] /></td>
  <td><input name="diameters[][bottom]" type="text" [..] /></td>
</tr>

This way you will end up having a simple array in the format of:

$_POST['diameters']=[
  ["top"=>"","bottom"=>""],
  ["top"=>"","bottom"=>""],
  ...
]

Which should make whatever you need to do with your data much simpler.

like image 35
Ant Avatar answered Sep 23 '22 15:09

Ant