การส่งอาร์เรย์หลายมิติผ่าน POST ด้วย php


103

ฉันมีรูปแบบ 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 หลายตัวแม้ว่าฉันจะมีความคิดว่าการใช้อาร์เรย์ 2 มิติเดียวจะเป็นแนวทางปฏิบัติที่ดีกว่าการใช้อาร์เรย์ 1D หลายตัว

คำตอบ:


149

ในการส่งคุณจะได้รับอาร์เรย์ราวกับว่าสร้างขึ้นดังนี้:

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

ถ้าคุณกำลังโคลนฟิลด์ข้อความและไม่มีการควบคุมในการเพิ่มชื่อสำหรับรายการเช่นname="diameters[0][top]ฉันจะทำอย่างไรถ้าฉันมีมากกว่าหนึ่งชื่อ? เช่นด้านบนด้านล่างซ้ายและขวา? @DisgruntledGoat
JMASTER B

@JMASTERB การเพิ่มล่าช้า แต่คุณจะต้องเพิ่มการประมวลผลบางอย่างด้วย JS เช่นหากเป็นไปตามลำดับคุณจะอ่านชื่ออินพุตก่อนหน้านี้หลังจากการโคลนและเพิ่มทีละ 1 ด้วยตนเองสำหรับแต่ละแอตทริบิวต์ชื่ออินพุตในโคลน
Daniel

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.