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

使用php通过POST提交多维数组,php,forms,post,multidimensional-array,submit,Php,Forms,Post,Multidimensional Array,Submit,我有一个php表单,它有已知数量的列(例如顶径、底径、结构、颜色、数量),但行数未知,因为用户可以根据需要添加行 我发现了如何获取每个字段(列)并将它们放入自己的数组中 <input name="topdiameter['+current+']" type="text" id="topdiameter'+current+'" size="5" /> <input name="bottomdiameter['+current+']" type="text" id="bottomd

我有一个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数组更好。

您可以提交具有此类命名的所有参数:

params[0][topdiameter]
params[0][bottomdiameter]
params[1][topdiameter]
params[1][bottomdiameter]
然后,稍后您将执行以下操作:

foreach ($_REQUEST['params'] as $item) {
    echo $item['topdiameter'];
    echo $item['bottomdiameter'];
}
$_POST['topdiameter'] = array( 'first value', 'second value' );
$_POST['bottomdiameter'] = array( 'first value', 'second value' );
<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>

提交时,您将得到一个数组,就像这样创建的:

foreach ($_REQUEST['params'] as $item) {
    echo $item['topdiameter'];
    echo $item['bottomdiameter'];
}
$_POST['topdiameter'] = array( 'first value', 'second value' );
$_POST['bottomdiameter'] = array( 'first value', 'second value' );
<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>
但是,我建议您将表单名称改为以下格式:

name="diameters[0][top]"
name="diameters[0][bottom]"
name="diameters[1][top]"
name="diameters[1][bottom]"
...
使用这种格式,循环遍历值就容易多了

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>';
}
if(isset($_POST['diameters']))
{
回声';
foreach($_POST['diameters']作为$diam)
{
//在这里您可以访问$diam['top']和$diam['bottom']
回声';
回声',$diam['top'],'';
回声',$diam['bottom'],'';
回声';
}
回声';
}

我制作了一个函数,可以处理数组以及单个GET或POST值

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;

}
示例:

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

我知道这是necro发布的帖子,但多年来,我一直在关注同一个问题,并多次得出相同的答案

今天虽然我还有一个问题, 我希望我的用户能够添加任意数量的项目,并在提交之前重新安排他们的输入,因此我选择了这个相对干净的解决方案:

$diameters = [];
foreach($_POST['diameters'] as $k=>$v){
 $val = intdiv($k,2);
 $photos[$val][key($v)]=$v[key($v)];
}
$_POST['diameters']=$diameters;
硬编码的
2
是因为这是输入块的大小(顶径、底径)

因此html可以简单地如下所示:

foreach ($_REQUEST['params'] as $item) {
    echo $item['topdiameter'];
    echo $item['bottomdiameter'];
}
$_POST['topdiameter'] = array( 'first value', 'second value' );
$_POST['bottomdiameter'] = array( 'first value', 'second value' );
<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>

这将使您需要对数据执行的任何操作都更加简单。

谢谢!我已经开始接近这一点了,尽管我已经翻转了列和行。如果您正在克隆文本字段,并且无法控制为列表添加名称,例如
name=“diameters[0][top],该怎么办
如果我有多个名字(如顶部、底部、左侧和右侧),我该怎么办@DisgruntledGoat@JMASTERB延迟添加,但您必须使用JS添加一些处理,即如果它们是有序的,那么您将在克隆后读取以前的输入名称,并手动为克隆中的每个输入名称属性增加1。