PHPでPOSTを介して多次元配列を送信する


102

ユーザーは必要に応じて行を追加できるため、既知の列数(例:上部の直径、下部の直径、生地、色、数量)の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配列を使用するよりも優れていると考えています。

回答:


148

送信すると、次のように作成されたかのように配列が取得されます。

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

ありがとう!列と行を反転させましたが、これに近づき始めました。
Fireflight 2010年

テキストフィールドのクローンを作成しname="diameters[0][top]ていて、複数の名前を持っている場合はどうすればよいかなど、リストの名前を追加できない場合はどうでしょうか。上、下、左、右など?@DisgruntledGoat
JMASTER B

@JMASTERB遅い追加ですが、JSでいくつかの処理を追加する必要があります。つまり、それらが適切な場合は、複製後に以前の入力名を読み取り、複製内の各入力名属性に対して手動で1ずつ増分します。
ダニエル

16

次のような名前のすべてのパラメータを送信できます。

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

その後、あなたはこのようなことをします:

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

0

配列と単一の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","");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.