Як отримати масив вводу форми в масив PHP


92

У мене є форма, подібна до наведеної нижче, яка розміщується на контактах.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);

так що мій результат такий:

Ім'я - ім'я1, а електронна адреса - електронна пошта1 , дякую
Ім'я - ім'я2, а електронна адреса - електронна пошта2 , дякую
Ім'я - ім'я3, а електронна адреса - електронна пошта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";
}

дякую, що якби я додав ще один вхід, як-от розташування [], як я можу додати це також?
th

1
В основному, ви просто розширюєте шаблон. Дивіться мою редакцію вище ... будь-які додаткові входи також будуть масивами, коли ви їх призначаєте з $ _POST (припускаючи, що в html є кілька входів з таким ім'ям, як це було зроблено з цими полями).
Джеффрі Блейк,

1
Джеффрі, мені цікаво, чи можу я довіряти упорядкуванню масивів. Тобто, ми впевнені, що $emails[1]відповідає іменованому користувачеві $name[1]? Я думаю, що раніше в мене виникали проблеми з цим, але я можу помилятися. Дякую
idrarig

1
@bruciasse - Спосіб, яким сервер обробляє вхідні масиви, як це, буде відрізнятися від одного веб-сервера до іншого (різні ОС реалізують речі по-різному, коли справа стосується дрібних деталей, таких як ця), однак кожна платформа, на якій я використовував ці методи, узгоджується в межах саме (тобто порядок кожного разу однаковий). Можливо, браузер змішав порядок змінних запиту перед передачею запиту на сервер, але я сподівався б, що це буде досить незвично. Останнє питання, з яким ви можете зіткнутися, - це змішування html у дивному порядку та коригування CSS
Джеффрі Блейк

... позиціонування. Якби ваша сторінка була такою, вона, безсумнівно, побачила б деякі дивні проблеми, не пов'язані з впорядкуванням масивів.
Джеффрі Блейк,

51

Наприклад, називаючи поля як

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

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.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/>";
    }

Це також масштабується. Все, що вам потрібно зробити, - це додавати відповідні масиви vars щоразу, коли вам потрібно додати нові поля.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.