PHP dizisine form girdi dizisi nasıl alınır


91

Kişiler.php'ye gönderilen aşağıdaki gibi bir formum var ve kullanıcı jquery ile dinamik olarak daha fazlasını ekleyebilir.

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

Bunları aşağıdaki kodla php'de yankıladığımda

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

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

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

Bunun gibi bir şey alacağım:

name1name2name3email1email2email3

bu dizileri aşağıdaki kod gibi bir şeye nasıl yerleştirebilirim

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

yani çıktım şöyle:

Adıdır isim1 ve e-posta olduğunu Email1 teşekkür ederim,
adıdır isim2 ve e-posta olduğunu email2 teşekkür ederim,
adıdır NAME3 ve e-posta olduğunu email3 teşekkür ederim

herhangi bir yardım veya tavsiye için teşekkür ederim

Yanıtlar:


146

Zaten diziler içindedirler: $nameolduğu gibi bir dizidir$email

Yani tek yapmanız gereken, her iki diziye de saldırmak için biraz işlem eklemek:

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

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

Daha fazla girişi işlemek için modeli genişletmeniz yeterlidir:

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

teşekkür ederim, ya location [] gibi başka bir girdi eklersem, bunu da nasıl ekleyebilirim?
thom

1
Temel olarak, sadece kalıbı genişletiyorsunuz. Yukarıdaki düzenlememe bakın ... $ _POST'tan onları atadığınızda, ek girişler de diziler olacaktır (bu alanlarda yaptığınız gibi html'de bu ada sahip birden fazla giriş olduğu varsayılarak).
Jeffrey Blake

1
Jeffrey, dizilerin sıralamasına güvenebilir miyim acaba? Yani, isimli $emails[1]kullanıcıya karşılık geldiğinden emin miyiz $name[1]? Sanırım geçmişte bununla ilgili sorunlar yaşadım ama yanılıyor olabilirim. Teşekkürler
idrarig

1
@bruciasse - Sunucunun bu gibi girdi dizilerini işleme biçimi bir web sunucusundan diğerine değişecektir (bunun gibi ince ayrıntılı ayrıntılar söz konusu olduğunda farklı işletim sistemleri işleri farklı şekilde uygular), ancak bu teknikleri kullandığım her platform kendi içinde tutarlıdır kendisi (yani sıralama her seferinde aynıdır). Bir tarayıcının, isteği sunucuya iletmeden önce istek değişkenlerinin sırasını karıştırması mümkündür, ancak bunun oldukça sıra dışı olmasını beklerim. Karşılaşabileceğiniz son sorun, html'nin garip bir sırayla karıştırılması ve CSS ayarlaması
Jeffrey Blake

... konumlandırma. Sayfanız böyle olsaydı, kesinlikle dizilerin sıralanması ile ilgili bazı garip sorunlar görürdü.
Jeffrey Blake

52

Örneğin, alanları aşağıdaki gibi adlandırarak

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

(javascript aracılığıyla öğe eklerken de mümkündür)

İlgili php betiği şöyle görünebilir:

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

Şimdi biraz geç olduğunu biliyorum, ama bunun gibi bir şey yapabilirsin:

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

İle test:

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

Bu benim için üretti:

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

Ya bir dizi alan kümeniz varsa?

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

Alan kümelerinin sayısını saymak için gizli bir alan ekledim. Kullanıcı alanları ekleyebilir veya silebilir ve ardından kaydedebilir.


2

Ben de bu problemle karşılaştım. 3 girdi verildiğinde: alan [], alan2 [], alan3 []

Bu alanların her birine dinamik olarak erişebilirsiniz. Her alan bir dizi olacağından, ilgili alanların tümü aynı dizi anahtarını paylaşacaktır. Örneğin, verilen giriş verileri:

  • Bob, bob@bob.com, erkek
  • Mark, mark@mark.com, erkek

Bob ve e-postası ve cinsiyeti aynı anahtarı paylaşacak. Bunu akılda tutarak, verilere aşağıdaki gibi bir for döngüsü içinde erişebilirsiniz:

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

Bu da ölçeklenir. Tek yapmanız gereken, eklenecek yeni alanlara ihtiyaç duyduğunuzda ilgili dizi değişkenlerinizi eklemektir.


0

Ancak, VolkerK'nın çözümü, e-posta ve kullanıcı adı arasındaki çiftleri kaçırmamak için en iyisidir. Öyleyse PHP ile şu şekilde HTML kodu oluşturmanız gerekir:

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

$ Total_data'yı ihtiyaçlarınıza uyacak şekilde değiştirin. Göstermek için, aynen şöyle:

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

Verilerin POST yöntemi kullanılarak gönderildiğini varsayarsak.


0

Bununla birlikte, aşağıdaki kodu şu şekilde kullanabilirsiniz:

$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

Bu kolay olanı:

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

-4

Bu yöntemi kullanmak işe yaramalı:

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

Cevabınızı adım adım açıklayın
krisdestruction
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.