Cách lấy mảng nhập biểu mẫu vào mảng PHP


92

Tôi có một biểu mẫu giống như biểu mẫu bên dưới được đăng lên contact.php và người dùng có thể tự động thêm nhiều hơn bằng 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[]" />

Nếu tôi lặp lại chúng bằng php với mã bên dưới

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

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

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

Tôi sẽ nhận được một cái gì đó như thế này:

name1name2name3email1email2email3

làm thế nào tôi có thể đưa những mảng đó vào một cái gì đó giống như mã bên dưới

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);

vì vậy đầu ra của tôi như thế này:

Tên là name1 và email là email1 , xin cảm ơn
Tên là name2 và email là email2 , xin cảm ơn
Tên là name3 và email là email3 , xin cảm ơn

cảm ơn bạn đã giúp đỡ hoặc lời khuyên

Câu trả lời:


146

Chúng đã có trong mảng: $namelà một mảng, như là$email

Vì vậy, tất cả những gì bạn cần làm là thêm một chút xử lý để tấn công cả hai mảng:

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

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

Để xử lý nhiều đầu vào hơn, chỉ cần mở rộng mẫu:

$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";
}

cảm ơn bạn, điều gì sẽ xảy ra nếu tôi đã thêm một đầu vào khác như vị trí [], làm cách nào tôi có thể thêm nó vào?
thom

1
Về cơ bản, bạn chỉ cần mở rộng mô hình. Xem chỉnh sửa của tôi ở trên ... bất kỳ đầu vào bổ sung nào cũng sẽ là mảng khi bạn gán chúng từ $ _POST (giả sử có nhiều đầu vào có tên đó trong html, như bạn đã làm với các trường này).
Jeffrey Blake,

1
Jeffrey, tôi tự hỏi liệu tôi có thể tin tưởng vào thứ tự của các mảng không. Đó là, chúng tôi có chắc chắn rằng $emails[1]tương ứng với người dùng có tên $name[1]không? Tôi nghĩ rằng tôi đã gặp vấn đề với điều này trong quá khứ nhưng tôi có thể đã sai. Cảm ơn
idrarig

1
@bruciasse - Cách máy chủ xử lý các mảng đầu vào như thế này sẽ thay đổi từ máy chủ web này sang máy chủ web khác (các hệ điều hành khác nhau triển khai mọi thứ khác nhau khi nói đến các chi tiết nhỏ như thế này), tuy nhiên mọi nền tảng tôi đã sử dụng các kỹ thuật này đều nhất quán bên trong chính nó (tức là thứ tự lần nào cũng giống nhau). Có thể một trình duyệt có thể trộn thứ tự của các biến yêu cầu trước khi chuyển yêu cầu đến máy chủ, nhưng tôi cho rằng điều này là khá bất thường. Vấn đề cuối cùng bạn có thể khuôn mặt là của html được trộn lẫn trong một trật tự và CSS lạ chỉnh
Jeffrey Blake

... định vị. Nếu trang của bạn là như vậy, nó chắc chắn sẽ thấy một số vấn đề kỳ lạ với thứ tự của các mảng.
Jeffrey Blake

51

Ví dụ: bằng cách đặt tên cho các trường như

<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]" />

(cũng có thể khi thêm các phần tử qua javascript)

Tập lệnh php tương ứng có thể trông giống như

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

Tôi biết bây giờ hơi muộn, nhưng bạn có thể làm điều gì đó như sau:

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

Thử nghiệm với:

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

Điều này cho tôi được sản xuất:

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

Điều gì sẽ xảy ra nếu bạn có một mảng các tập trường?

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

Tôi đã thêm một trường ẩn để đếm số lượng các bộ trường. Người dùng có thể thêm hoặc xóa các trường và sau đó lưu nó.


2

Tôi cũng gặp phải vấn đề này. Cho 3 đầu vào: field [], field2 [], field3 []

Bạn có thể truy cập động từng trường này. Vì mỗi trường sẽ là một mảng nên các trường liên quan sẽ dùng chung một khóa mảng. Ví dụ: dữ liệu đầu vào đã cho:

  • Bob, bob@bob.com, nam
  • Đánh dấu, mark@mark.com, nam

Bob và email và giới tính của anh ấy sẽ dùng chung một khóa. Với ý nghĩ này, bạn có thể truy cập dữ liệu trong một vòng lặp for như sau:

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

Quy mô này cũng vậy. Tất cả những gì bạn cần làm là thêm các vars mảng tương ứng của mình bất cứ khi nào bạn cần thêm các trường mới.


0

Tuy nhiên, giải pháp của VolkerK là tốt nhất để tránh bỏ sót cặp đôi giữa email và tên người dùng. Vì vậy, bạn phải tạo mã HTML bằng PHP như sau:

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

Thay đổi $ total_data để phù hợp với nhu cầu của bạn. Để hiển thị nó, giống như sau:

$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);

Giả sử dữ liệu được gửi bằng phương thức POST.


0

Tuy nhiên, bạn có thể sử dụng mã dưới đây như,

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

0

Đây là một trong những dễ dàng:

foreach( $_POST['field'] as $num => $val ) {
      print ' '.$num.' -> '.$val.' ';
    }

-4

Sử dụng phương pháp này sẽ hoạt động:

$name = $_POST['name'];
$email = $_POST['account'];
while($explore=each($email)) {
    echo $explore['key'];
    echo "-";
    echo $explore['value'];
    echo "<br/>";
}

Giải thích bước câu trả lời của bạn bằng cách bước
krisdestruction
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.