Как получить массив ввода формы в массив 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, а адрес электронной почты - email1 , спасибо
. Имя - name2, адрес электронной почты - email2 , спасибо
. Имя - name3, а адрес электронной почты - email3 , спасибо.

спасибо за любую помощь или совет

thom
источник

Ответы:

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";
}
Джеффри Блейк
источник
спасибо, а что если я добавлю еще один ввод, например location [], как я могу добавить его?
thom
1
По сути, вы просто расширяете узор. См. Мою правку выше ... любые дополнительные входы также будут массивами, когда вы назначите их из $ _POST (при условии, что в html есть несколько входов с таким именем, как вы это делали с этими полями).
Джеффри Блейк
1
Джеффри, интересно, могу ли я доверять порядку массивов. То есть уверены, что это $emails[1]соответствует названному пользователю $name[1]? Я думаю, что раньше сталкивался с этим с проблемами, но могу ошибаться. Спасибо
idrarig
1
@bruciasse - способ, которым сервер обрабатывает такие входные массивы, будет варьироваться от одного веб-сервера к другому (разные операционные системы реализуют вещи по-разному, когда дело доходит до таких мелких деталей), однако каждая платформа, на которой я использовал эти методы, согласована в пределах сам (т.е. порядок всегда один и тот же). Вполне возможно, что браузер может перепутать порядок переменных запроса перед передачей запроса на сервер, но я ожидал, что это будет довольно необычно. Последняя проблема, с которой вы можете столкнуться, - это смешивание html в странном порядке и корректировка CSS
Джеффри Блейк,
... позиционирование. Если бы ваша страница была такой, она бы наверняка столкнулась с некоторыми странными проблемами с упорядочением массивов.
Джеффри Блейк
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]" />

(что также возможно при добавлении элементов через javascript)

Соответствующий скрипт 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
источник
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)
Can O 'Spam
источник
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.com, мужчина
  • Марк, mark@mark.com, кобель

Боб, его адрес электронной почты и пол будут иметь один и тот же ключ. Имея это в виду, вы можете получить доступ к данным в цикле for следующим образом:

    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>';
}
Абхишек Гурджар
источник
0

Это просто:

foreach( $_POST['field'] as $num => $val ) {
      print ' '.$num.' -> '.$val.' ';
    }
Ян
источник
-4

Использование этого метода должно работать:

$name = $_POST['name'];
$email = $_POST['account'];
while($explore=each($email)) {
    echo $explore['key'];
    echo "-";
    echo $explore['value'];
    echo "<br/>";
}
Рафаэль Гейтс
источник
Пошагово объясни свой ответ
krisdestruction