105

I have a form like the one below which is posted to contacts.php, and the user can dynamically add more with 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[]" />

If I echo them out in PHP with the code below,

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

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

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

I will get something like this:

name1name2name3email1email2email3

How can I get those arrays into something like the code below?

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

so my output is like this:

The name is name1 and email is email1, thank you The name is name2 and email is email2, thank you The name is name3 and email is email3, thank you

9 Answers 9

160

They are already in arrays: $name is an array, as is $email

So all you need to do is add a bit of processing to attack both arrays:

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

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

To handle more inputs, just extend the pattern:

$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";
}
Sign up to request clarification or add additional context in comments.

8 Comments

thank you, what if i added another input like location[], how could i add that in as well?
Basically, you just extend the pattern. See my edit above...any additional inputs will also be arrays when you assign them from $_POST (assuming there are multiple inputs with that name in the html, as you did with these fields).
Jeffrey, I wonder if I can trust the ordering of the arrays. That is, are we sure that $emails[1] corresponds to the user named $name[1]? I think I ran into problems with this in the past but I might be wrong. Thanks
@bruciasse - The way that the server handles input arrays like this will vary from one web server to another (different OSes implement things differently when it comes to fine grained details like this), however every platform I have employed these techniques on is consistent within itself (i.e. the ordering is the same every time). It is possible that a browser could mix-up the order of the request variables before passing the request to the server, but I would expect this to be fairly unusual. The final issue you could face is that of the html being mixed in a strange order and CSS adjusting
... the positioning. If your page was like that, it would certainly see some strange issues w/r/t ordering of the arrays.
|
58

E.g. by naming the fields like

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

(which is also possible when adding elements via JavaScript)

The corresponding PHP script might look like

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

1 Comment

Hi Thanks for this, how do you do the php script in laravel 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

You could do something such as this:

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

The test with:

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

This for me produced:

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)

Comments

2

I came across this problem as well. Given 3 inputs: field[], field2[], field3[]

You can access each of these fields dynamically. Since each field will be an array, the related fields will all share the same array key. For example, given input data:

Bob and his email and sex will share the same key. With this in mind, you can access the data in a for loop like this:

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

This scales as well. All you need to do is add your respective array vars whenever you need new fields to be added.

Comments

2

You can use an array of fieldsets:

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

I added a hidden field to count the number of the fieldsets. The user can add or delete the fields and then save it.

Comments

0

However, VolkerK's solution is the best to avoid miss couple between email and username. So you have to generate HTML code with PHP like this:

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

Change $total_data to suit your needs. To show it, just like this:

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

Assuming the data was sent using POST method.

Comments

0

This is an easy one:

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

1 Comment

An explanation would be in order. E.g., what is the idea/gist? Please respond by editing (changing) your answer, not here in comments (without "Edit:", "Update:", or similar - the answer should appear as if it was written today).
0

Already is an array. My inputs are:

<input name="name[]" value='joe'>
<input name="lastname[]" value='doe'>
<input name="name[]" value='jose'>
<input name="lastname[]" value='morrison'>

In the $_POST data, returns the following:

[name] => Array
    (
        [0] => 'joe'
        [1] => 'jose'
    )
[lastname] => Array
    (
        [0] =>  'doe'
        [1] => 'morrison'
    )

You can access to these data, in the following way:

$names = $_POST['name']
$lastnames = $_POST['lastname']
// accessing
echo $names[0]; // joe

This way It is very useful for creating pivot tables.

1 Comment

Please only post a new answer if you have something new and unique to add to the page.
-4

Using this method should work:

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

2 Comments

Explain your answer step by step
An explanation would be in order. E.g., what is the idea/gist? Please respond by editing (changing) your answer, not here in comments (without "Edit:", "Update:", or similar - the answer should appear as if it was written today).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.