【问题标题】:Submitting a multidimensional array via POST with php使用 php 通过 POST 提交多维数组
【发布时间】:2011-01-26 21:13:36
【问题描述】:

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

【问题讨论】:

    标签: php forms post multidimensional-array submit


    【解决方案1】:

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

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

    但是,我建议将您的表单名称改为这种格式:

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

    【讨论】:

    • 谢谢!我已经开始接近这个了,尽管我已经翻转了列和行。
    • 如果您正在克隆文本字段并且无法控制为列表添加名称,例如name="diameters[0][top],如果我有多个名称该怎么办?比如上、下、左、右? @DisgruntledGoat
    • @JMASTERB 后期添加但是你必须用JS添加一些处理,即如果它们是有序的,你会在克隆后读取之前的输入名称,并为每个输入名称属性手动增加1在克隆中。
    【解决方案2】:

    您可以使用这样的命名提交所有参数:

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

    然后你做这样的事情:

    foreach ($_REQUEST['params'] as $item) {
        echo $item['topdiameter'];
        echo $item['bottomdiameter'];
    }
    

    【讨论】:

      【解决方案3】:

      我知道这是 necro-posting,但多年来我一直在运行同样的问题并最终得到同样的答案很多很多次。

      今天虽然我有一个额外的问题, 我希望我的用户能够添加任意数量的项目,并在提交之前重新排列他们的输入,所以我找到了这个相对干净的解决方案:

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

      硬编码2是因为那是输入块的大小(topdiameter,bottomdiameter)

      所以 html 可以简单地看起来像这样:

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

      这样你最终会得到一个简单的数组,格式如下:

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

      无论您需要对数据做什么都应该更简单。

      【讨论】:

        【解决方案4】:

        我创建了一个处理数组以及单个 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","");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-04
          • 2011-04-05
          • 2011-05-14
          • 2016-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-22
          相关资源
          最近更新 更多