วิธีรับอาร์เรย์อินพุตแบบฟอร์มลงในอาร์เรย์ PHP


91

ฉันมีแบบฟอร์มด้านล่างซึ่งโพสต์ไว้ที่ contacts.php และผู้ใช้สามารถเพิ่มแบบไดนามิกได้ด้วย jquery

<input type="text" name="name[]" />
<input type="text" name="email[]" />

<input type="text" name="name[]" />
<input type="text" name="email[]" />

<input type="text" name="name[]" />
<input type="text" name="email[]" />

หากฉันสะท้อนออกมาใน php ด้วยรหัสด้านล่าง

$name = $_POST['name'];
$email = $_POST['account'];

foreach( $name as $v ) {
print $v;
}

foreach( $email as $v ) {
print $v;
}

ฉันจะได้รับสิ่งนี้:

name1name2name3email1email2email3

ฉันจะนำอาร์เรย์เหล่านั้นไปเป็นโค้ดด้านล่างได้อย่างไร

function show_Names($n, $m)
{
return("The name is $n and email is $m, thank you");
}

$a = array("name1", "name2", "name3");
$b = array("email1", "email2", "email3");

$c = array_map("show_Names", $a, $b);
print_r($c);

ดังนั้นผลลัพธ์ของฉันจึงเป็นดังนี้:

ชื่อคือname1และอีเมลคืออีเมล1ขอบคุณ
ชื่อคือname2และอีเมลคืออีเมล2ขอบคุณ
ชื่อคือname3และอีเมลคืออีเมล3ขอบคุณ

ขอบคุณสำหรับความช่วยเหลือหรือคำแนะนำ

คำตอบ:


146

มีอยู่แล้วในอาร์เรย์: $nameเป็นอาร์เรย์ตามที่เป็นอยู่$email

ดังนั้นสิ่งที่คุณต้องทำคือเพิ่มการประมวลผลเล็กน้อยเพื่อโจมตีทั้งสองอาร์เรย์:

$name = $_POST['name'];
$email = $_POST['account'];

foreach( $name as $key => $n ) {
  print "The name is ".$n." and email is ".$email[$key].", thank you\n";
}

ในการจัดการอินพุตเพิ่มเติมเพียงแค่ขยายรูปแบบ:

$name = $_POST['name'];
$email = $_POST['account'];
$location = $_POST['location'];

foreach( $name as $key => $n ) {
  print "The name is ".$n.", email is ".$email[$key].
        ", and location is ".$location[$key].". Thank you\n";
}

ขอบคุณถ้าฉันเพิ่มอินพุตอื่นเช่นตำแหน่ง [] ฉันจะเพิ่มข้อมูลนั้นเข้าไปด้วยได้อย่างไร

1
โดยพื้นฐานแล้วคุณเพียงแค่ขยายรูปแบบ ดูการแก้ไขของฉันด้านบน ... อินพุตเพิ่มเติมใด ๆ จะเป็นอาร์เรย์เมื่อคุณกำหนดจาก $ _POST (สมมติว่ามีอินพุตหลายรายการที่มีชื่อนั้นใน html เช่นเดียวกับที่คุณทำกับฟิลด์เหล่านี้)
Jeffrey Blake

1
เจฟฟรีย์ฉันสงสัยว่าฉันสามารถเชื่อถือลำดับของอาร์เรย์ได้หรือไม่ นั่นคือเราแน่ใจหรือไม่ว่า$emails[1]สอดคล้องกับผู้ใช้ที่ชื่อ$name[1]? ฉันคิดว่าฉันเคยประสบปัญหานี้ในอดีต แต่ฉันอาจคิดผิด ขอบคุณ
idrarig

1
@bruciasse - วิธีที่เซิร์ฟเวอร์จัดการกับอาร์เรย์อินพุตเช่นนี้จะแตกต่างกันไปในแต่ละเว็บเซิร์ฟเวอร์ (ระบบปฏิบัติการที่แตกต่างกันใช้สิ่งต่างกันเมื่อพูดถึงรายละเอียดแบบละเอียดเช่นนี้) อย่างไรก็ตามทุกแพลตฟอร์มที่ฉันใช้เทคนิคเหล่านี้มีความสอดคล้องกันภายใน ตัวมันเอง (เช่นการสั่งซื้อจะเหมือนกันทุกครั้ง) เป็นไปได้ว่าเบราว์เซอร์สามารถผสมลำดับของตัวแปรคำขอก่อนที่จะส่งคำขอไปยังเซิร์ฟเวอร์ แต่ฉันคาดว่าสิ่งนี้จะค่อนข้างผิดปกติ ปัญหาสุดท้ายที่คุณต้องเผชิญคือ html ที่ผสมกันในลำดับแปลก ๆ และการปรับ CSS
Jeffrey Blake

... การวางตำแหน่ง. หากหน้าของคุณเป็นเช่นนั้นแน่นอนว่าจะพบปัญหาแปลก ๆ บางอย่างที่ไม่มีการเรียงลำดับอาร์เรย์
Jeffrey Blake

52

เช่นการตั้งชื่อฟิลด์เช่น

<input type="text" name="item[0][name]" />
<input type="text" name="item[0][email]" />

<input type="text" name="item[1][name]" />
<input type="text" name="item[1][email]" />

<input type="text" name="item[2][name]" />
<input type="text" name="item[2][email]" />

(ซึ่งเป็นไปได้เช่นกันเมื่อเพิ่มองค์ประกอบผ่านทางจาวาสคริปต์)

สคริปต์ php ที่เกี่ยวข้องอาจมีลักษณะดังนี้

function show_Names($e)
{
  return "The name is $e[name] and email is $e[email], thank you";
}

$c = array_map("show_Names", $_POST['item']);
print_r($c);

4

ฉันรู้ว่ามันช้าไปหน่อย แต่คุณสามารถทำสิ่งนี้ได้:

function AddToArray ($post_information) {
    //Create the return array
    $return = array();
    //Iterate through the array passed
    foreach ($post_information as $key => $value) {
        //Append the key and value to the array, e.g.
            //$_POST['keys'] = "values" would be in the array as "keys"=>"values"
        $return[$key] = $value;
    }
    //Return the created array
    return $return;
}

การทดสอบกับ:

if (isset($_POST['submit'])) {
    var_dump(AddToArray($_POST));
}

สิ่งนี้สำหรับฉันผลิต:

array (size=1)
  0 => 
    array (size=5)
      'stake' => string '0' (length=1)
      'odds' => string '' (length=0)
      'ew' => string 'false' (length=5)
      'ew_deduction' => string '' (length=0)
      'submit' => string 'Open' (length=4)

2

จะเป็นอย่างไรถ้าคุณมีชุดฟิลด์ต่างๆ

<fieldset>
<input type="text" name="item[1]" />
<input type="text" name="item[2]" />
<input type="hidden" name="fset[]"/>
</fieldset>

<fieldset>
<input type="text" name="item[3]" />
<input type="text" name="item[4]" />
<input type="hidden" name="fset[]"/>
</fieldset>

ฉันเพิ่มฟิลด์ที่ซ่อนไว้เพื่อนับจำนวนชุดฟิลด์ ผู้ใช้สามารถเพิ่มหรือลบเขตข้อมูลแล้วบันทึก


2

ฉันเจอปัญหานี้เช่นกัน ให้ 3 อินพุต: ฟิลด์ [], ฟิลด์ 2 [], ฟิลด์ 3 []

คุณสามารถเข้าถึงแต่ละฟิลด์เหล่านี้แบบไดนามิก เนื่องจากแต่ละฟิลด์จะเป็นอาร์เรย์ฟิลด์ที่เกี่ยวข้องทั้งหมดจะแชร์คีย์อาร์เรย์เดียวกัน ตัวอย่างเช่นข้อมูลอินพุตที่กำหนด:

  • Bob, bob@bob.com, ชาย
  • เครื่องหมาย mark@mark.com ชาย

บ็อบและอีเมลและเพศของเขาจะใช้คีย์เดียวกัน ด้วยเหตุนี้คุณจึงสามารถเข้าถึงข้อมูลใน for loop ดังนี้:

    for($x = 0; $x < count($first_name); $x++ )
    {
        echo $first_name[$x];
        echo $email[$x];
        echo $sex[$x];
        echo "<br/>";
    }

เครื่องชั่งนี้เช่นกัน สิ่งที่คุณต้องทำคือเพิ่มตัวแปรอาร์เรย์ของคุณเมื่อใดก็ตามที่คุณต้องการเพิ่มฟิลด์ใหม่


0

อย่างไรก็ตามวิธีแก้ปัญหาของ VolkerK คือวิธีที่ดีที่สุดในการหลีกเลี่ยงการพลาดคู่ระหว่างอีเมลและชื่อผู้ใช้ ดังนั้นคุณต้องสร้างโค้ด HTML ด้วย PHP ดังนี้:

<? foreach ($i = 0; $i < $total_data; $i++) : ?>
    <input type="text" name="name[<?= $i ?>]" />
    <input type="text" name="email[<?= $i ?>]" />
<? endforeach; ?>

เปลี่ยน $ total_data ให้เหมาะกับความต้องการของคุณ เพื่อแสดงให้เห็นสิ่งนี้:

$output = array_map(create_function('$name, $email', 'return "The name is $name and email is $email, thank you.";'), $_POST['name'], $_POST['email']);
echo implode('<br>', $output);

สมมติว่าข้อมูลถูกส่งโดยใช้วิธีการ POST


0

อย่างไรก็ตามคุณสามารถใช้โค้ดด้านล่างเป็น

$a = array('name1','name2','name3');
$b = array('email1','email2','email3');

function f($a,$b){
    return "The name is $a and email is $b, thank you";
}

$c = array_map('f', $a, $b);

//echoing the result

foreach ($c as $val) {
    echo $val.'<br>';
}


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.