Jak uzyskać tablicę wejściową formularza do tablicy PHP

91

Mam formularz podobny do poniższego, który jest wysyłany do contacts.php, a użytkownik może dynamicznie dodawać kolejne za pomocą 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[]" />

Jeśli powiem je w php za pomocą poniższego kodu

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

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

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

Otrzymam coś takiego:

name1name2name3email1email2email3

jak mogę wprowadzić te tablice do czegoś podobnego do poniższego kodu

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

więc mój wynik wygląda tak:

Imię to name1, a e-mail to email1 , dziękuję
Imię to name2, a email to email2 , dziękuję
Imię to name3, a email to email3 , dziękuję

dziękuję za pomoc lub radę

thom
źródło

Odpowiedzi:

146

Są już w tablicach: $namejest tablicą, jaka jest$email

Wszystko, co musisz zrobić, to dodać trochę przetwarzania, aby zaatakować obie tablice:

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

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

Aby obsłużyć więcej danych wejściowych, po prostu rozszerz wzorzec:

$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";
}
Jeffrey Blake
źródło
dziękuję, a co jeśli dodam inne dane wejściowe, takie jak lokalizacja [], jak mogę to również dodać?
thom
1
Zasadniczo po prostu przedłużasz wzór. Zobacz moją edycję powyżej ... wszelkie dodatkowe dane wejściowe będą również tablicami, gdy przypiszesz je z $ _POST (zakładając, że istnieje wiele danych wejściowych o tej nazwie w html, tak jak w przypadku tych pól).
Jeffrey Blake
1
Jeffrey, zastanawiam się, czy mogę ufać porządkowaniu tablic. To znaczy, czy na pewno $emails[1]jest to nazwa użytkownika $name[1]? Myślę, że miałem z tym problemy w przeszłości, ale mogę się mylić. Dzięki
idrarig
1
@bruciasse - Sposób, w jaki serwer obsługuje takie tablice wejściowe, będzie się różnić w zależności od serwera internetowego (różne systemy operacyjne implementują różne rzeczy, jeśli chodzi o szczegółowe szczegóły, takie jak ta), jednak każda platforma, na której zastosowałem te techniki, jest spójna w ramach (tj. kolejność jest za każdym razem taka sama). Możliwe, że przeglądarka pomyliłaby kolejność zmiennych żądania przed przekazaniem żądania do serwera, ale spodziewałbym się, że będzie to dość nietypowe. Ostatnim problemem, z którym możesz się zmierzyć, jest mieszanie html w dziwnej kolejności i dostosowywanie CSS
Jeffrey Blake
... pozycjonowanie. Gdyby twoja strona była taka, z pewnością zobaczyłby jakieś dziwne problemy w / r / t porządkowanie tablic.
Jeffrey Blake
52

Np. Przez nazwanie pól w stylu

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

(co jest również możliwe przy dodawaniu elementów przez javascript)

Może wyglądać odpowiedni skrypt 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);
VolkerK
źródło
4

Wiem, że jest teraz trochę za późno, ale możesz zrobić coś takiego:

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

Test z:

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

To dla mnie wyprodukowało:

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)
Can O 'Spam
źródło
2

A jeśli masz tablicę zestawów pól?

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

Dodałem ukryte pole, aby policzyć liczbę zestawów pól. Użytkownik może dodawać lub usuwać pola, a następnie je zapisać.

Sophia Gavish
źródło
2

Trafiłem też na ten problem. Biorąc pod uwagę 3 dane wejściowe: pole [], pole2 [], pole3 []

Możesz uzyskać dostęp do każdego z tych pól dynamicznie. Ponieważ każde pole będzie tablicą, wszystkie powiązane pola będą miały ten sam klucz tablicy. Na przykład podane dane wejściowe:

Bob, jego e-mail i płeć będą mieć ten sam klucz. Mając to na uwadze, możesz uzyskać dostęp do danych w pętli for w następujący sposób:

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

To również się skaluje. Wszystko, co musisz zrobić, to dodać odpowiednie zmienne tablicy, gdy potrzebujesz dodać nowe pola.

thatonefreeman
źródło
0

Jednak rozwiązanie VolkerK jest najlepszym sposobem na uniknięcie pomijania adresu e-mail i nazwy użytkownika. Więc musisz wygenerować kod HTML za pomocą PHP w następujący sposób:

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

Zmień $ total_data według swoich potrzeb. Aby to pokazać, tak po prostu:

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

Przy założeniu, że dane zostały przesłane metodą POST.

iroel
źródło
0

Niemniej jednak możesz użyć poniższego kodu jako,

$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>';
}
Abhishek Gurjar
źródło
0

To jest łatwe:

foreach( $_POST['field'] as $num => $val ) {
      print ' '.$num.' -> '.$val.' ';
    }
Ian
źródło
-4

Użycie tej metody powinno działać:

$name = $_POST['name'];
$email = $_POST['account'];
while($explore=each($email)) {
    echo $explore['key'];
    echo "-";
    echo $explore['value'];
    echo "<br/>";
}
Raphael Gates
źródło
Wyjaśnij swoją odpowiedź krok po kroku
krisdestruction