使用 php 通过 POST 提交多维数组

我有一个已知列数的 php 表单(如。顶部直径,底部直径,织物,颜色,数量) ,但有一个未知的行数,因为用户可以添加行,因为他们需要。

我已经发现了如何获取每个字段(列)并将它们放入自己的数组中。

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

因此,我在 HTML 中得到的结论是:

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

我现在想要做的是将所有的行和列放入一个多维数组中,并将其中的内容通过电子邮件发送给客户端(最好是在一个格式良好的表中)。我还不能真正理解如何将所有这些输入和选择组合成一个漂亮的数组。

在这一点上,我将不得不尝试使用几个1D 数组,尽管我认为使用单个2D 数组比使用多个1D 数组更好。

187103 次浏览

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'];
}

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>';
}

I made a function which handles arrays as well as single GET or POST values

function subVal($varName, $default=NULL,$isArray=FALSE ){ // $isArray toggles between (multi)array or single mode


$retVal = "";
$retArray = array();


if($isArray) {
if(isset($_POST[$varName])) {
foreach ( $_POST[$varName] as $var ) {  // multidimensional POST array elements
$retArray[]=$var;
}
}
$retVal=$retArray;
}


elseif (isset($_POST[$varName]) )  {  // simple POST array element
$retVal = $_POST[$varName];
}


else {
if (isset($_GET[$varName]) ) {
$retVal = $_GET[$varName];    // simple GET array element
}
else {
$retVal = $default;
}
}


return $retVal;


}

Examples:

$curr_topdiameter = subVal("topdiameter","",TRUE)[3];
$user_name = subVal("user_name","");

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.

@DisgruntledGoat 's answer is absolutely correct; however, in case anyone is looking for values that are not set to required, meaning $_POST === null could happen, you would use the isset() conditional as such:

$placeHolderValue = "Incomplete";


if ( isset( $_POST['diameters'] ) )
{
echo '<table>';
foreach ( $_POST['diameters'] as $diam )
{
// here you have access to $diam['top'] and $diam['bottom']
echo '<tr>';
if (isset($diam['top'])) {
echo '  <td>' . $diam['top'] . '</td>';
} else {
echo '<td>' . $placeHolderValue . '</td>';
if (isset($diam['top'])) {
echo '  <td>' . $diam['bottom'] . '</td>';
} else {
echo '<td>' . $placeHolderValue . '</td>';
echo '</tr>';
}
echo '</table>';
}

This all using the naming format that @DisgruntledGoat mentioned in their answer.