簡體   English   中英

使用 php 通過 POST 提交多維數組

[英]Submitting a multidimensional array via POST with php

我有一個 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.

我現在想做的是將所有行和列放入一個多維數組中,並將 email 的內容提供給客戶端(最好是格式良好的表格)。 我一直無法真正理解如何將所有這些輸入和選擇組合成一個漂亮的數組。

此時,我將不得不嘗試使用多個 1D arrays,盡管我認為使用單個 2D 陣列會比使用多個 1D arrays 更好。

在提交時,您將獲得一個數組,就好像這樣創建:

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

您可以使用這樣的命名提交所有參數:

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

然后你會做這樣的事情:

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

我知道這是 necro-posting,但多年來我一直在運行同樣的問題並最終得到同樣的答案很多很多次。

今天雖然我有一個額外的問題,但我希望我的用戶能夠添加他們想要的任意數量的項目,以及在提交之前重新排列他們的輸入,所以我想出了這個相對干凈的解決方案:

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

硬編碼2是因為這是輸入塊的大小(頂部直徑,底部直徑)

所以 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"=>""],
  ...
]

這應該使您需要對數據執行的任何操作都變得更加簡單。

@DisgruntledGoat 的回答是絕對正確的 但是,如果有人正在尋找未設置為必需的值,這意味着$_POST === null可能發生,您可以使用isset()條件:

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

這一切都使用@DisgruntledGoat 在他們的回答中提到的命名格式。

我創建了一個處理數組以及單個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","");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM