PHP ile POST aracılığıyla çok boyutlu bir dizi gönderme


103

Bilinen sayıda sütuna (ör. Üst çap, alt çap, kumaş, renk, miktar) sahip, ancak kullanıcılar ihtiyaç duydukları kadar satır ekleyebildikleri için bilinmeyen sayıda satıra sahip bir php formum var.

Alanların (sütunların) her birini nasıl alıp kendilerine ait bir diziye yerleştireceğimi keşfettim.

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

Yani HTML'de bulduğum şey:

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

Şimdi yapmak istediğim şey, tüm satırları ve sütunları çok boyutlu bir diziye yerleştirmek ve bunun içeriğini müşteriye e-posta ile göndermektir (tercihen güzel biçimlendirilmiş bir tabloda). Tüm bu girdileri ve seçimleri güzel bir dizide nasıl birleştireceğimi gerçekten anlayamadım.

Bu noktada, birkaç 1D dizisi kullanmayı denemem gerekecek, ancak tek bir 2D dizi kullanmanın birkaç 1D dizisi kullanmaktan daha iyi bir uygulama olacağı fikrine sahip olsam da.

Yanıtlar:


149

Gönderdiğinizde, şu şekilde oluşturulmuş gibi bir dizi elde edersiniz:

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

Bununla birlikte, bunun yerine form adlarınızı bu biçime değiştirmenizi öneririm:

name="diameters[0][top]"
name="diameters[0][bottom]"
name="diameters[1][top]"
name="diameters[1][bottom]"
...

Bu formatı kullanarak değerler arasında döngü yapmak çok daha kolaydır.

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

Teşekkürler! Sütun ve satırların ters çevrilmesine rağmen buna yaklaşmaya başladım.
Fireflight

Metin alanlarını klonluyorsanız ve name="diameters[0][top]birden fazla adım varsa ne yapabilirim gibi liste için ad ekleme konusunda hiçbir kontrolünüz yoksa nasıl olur? üst, alt, sol ve sağ gibi? @DisgruntledGoat
JMASTER B

@JMASTERB Geç ekleme, ancak JS ile bazı işlemler eklemeniz gerekir, yani sıralıysa, klonlamadan sonra önceki giriş adını okursunuz ve klondaki her giriş adı özniteliği için manuel olarak 1 artar.
Daniel

16

tüm parametreleri bu adla gönderebilirsiniz:

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

daha sonra böyle bir şey yaparsınız:

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

0

Dizileri ve tek GET veya POST değerlerini işleyen bir işlev yaptım

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;

}

Örnekler:

$curr_topdiameter = subVal("topdiameter","",TRUE)[3];
$user_name = subVal("user_name","");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.