Mengirimkan array multidimensi melalui POST dengan php

103

Saya memiliki formulir php yang memiliki jumlah kolom yang diketahui (mis. Diameter atas, diameter bawah, kain, warna, kuantitas), tetapi memiliki jumlah baris yang tidak diketahui, karena pengguna dapat menambahkan baris sesuai kebutuhan.

Saya telah menemukan cara mengambil setiap field (kolom) dan menempatkannya ke dalam array mereka sendiri.

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

Jadi yang saya dapatkan di HTML adalah:

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

Apa yang ingin saya lakukan sekarang adalah mengambil semua baris dan kolom, memasukkannya ke dalam array multidimensi dan mengirimkan isinya melalui email ke klien (sebaiknya dalam tabel yang diformat dengan baik). Saya belum bisa benar-benar memahami bagaimana menggabungkan semua input tersebut dan memilih menjadi array yang bagus.

Pada titik ini, saya harus mencoba menggunakan beberapa array 1D, meskipun saya memiliki gagasan bahwa menggunakan array 2D tunggal akan menjadi praktik yang lebih baik daripada menggunakan beberapa array 1D.

Fireflight
sumber

Jawaban:

149

Saat mengirimkan, Anda akan mendapatkan array seperti jika dibuat seperti ini:

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

Namun, saya sarankan untuk mengubah nama formulir Anda ke format ini:

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

Menggunakan format itu, jauh lebih mudah untuk mengulang nilai.

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>';
}
Kambing Tidak Puas
sumber
Terima kasih! Saya mulai mendekati ini, meskipun saya membalik kolom dan baris.
Fireflight
Bagaimana jika Anda mengkloning bidang teks dan tidak memiliki kendali dalam menambahkan nama untuk daftar seperti name="diameters[0][top]apa yang dapat saya lakukan jika saya memiliki lebih dari satu nama? seperti atas, bawah, kiri dan kanan? @DisgruntledGoat
JMASTER B
@JMASTERB Penambahan terlambat tetapi Anda harus menambahkan beberapa pemrosesan dengan JS, yaitu jika sudah berurutan, Anda akan membaca nama masukan sebelumnya setelah kloning, dan menambah 1 secara manual untuk setiap atribut nama masukan dalam kloning.
Daniel
16

Anda bisa mengirimkan semua parameter dengan penamaan seperti itu:

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

kemudian Anda melakukan sesuatu seperti ini:

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

Saya membuat fungsi yang menangani array serta nilai GET atau POST tunggal

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;

}

Contoh:

$curr_topdiameter = subVal("topdiameter","",TRUE)[3];
$user_name = subVal("user_name","");
Szél Lajos
sumber