如何将表单输入数组转换为PHP数组

105

我有一个表单,类似下面这样的表单,它被提交到 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,谢谢

9个回答

160

这些值已经在数组中了:$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";
}

1
基本上,你只需要扩展这个模式。请参见我上面的编辑...当你从 $_POST 分配它们时,任何其他输入也将是数组(假设在 HTML 中有多个具有该名称的输入,就像你在这些字段中所做的那样)。 - Jeffrey Blake
1
Jeffrey,我想知道我是否可以信任数组的排序。也就是说,我们确定$emails[1]对应于名为$name[1]的用户吗?我认为我过去遇到过这个问题,但我可能错了。谢谢。 - nicolagi
1
@bruciasse - 服务器处理这样的输入数组的方式因Web服务器而异(不同的操作系统在细节方面实现不同),但我使用这些技术的每个平台在其内部是一致的(即排序每次都相同)。浏览器在将请求传递给服务器之前可能会混淆请求变量的顺序,但我认为这种情况相当罕见。您可能会遇到的最后一个问题是HTML以奇怪的顺序混合在一起,而CSS进行调整。 - Jeffrey Blake
@JeffreyBlake,这里有一个问题,foreach使用的是值数组,而 $name = $_POST['name']; 会将其留作字符串,因此当您尝试遍历它时,系统会立即中断,因为它不是一个数组而是一个字符串。您是不是想用 $name[] = $_POST['name']; 代替这个呢?(抱歉回复晚了,当我看到这个问题时感到有些误导...) - Can O' Spam
@SamSwift 你假设 $_POST['name'] 是一个字符串。但是,如果你的页面有多个具有相同名称值的 <input> 元素,则不是这种情况。当发生这种情况时,PHP 将会将 $_POST 变量加载为一个数组。确实,在只有一个输入元素的情况下,此代码可能无法按预期工作。如果你正在处理一个动态生成的表单,该表单可以具有任意数量的输入,则可能需要添加处理零个或一个输入的情况,而不是许多输入,但这超出了本问题/答案的范围。 - Jeffrey Blake
显示剩余3条评论

58

例如,通过将字段命名为

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

嗨,感谢您。请问如何在Laravel中编写PHP脚本的show_Names($e)函数?{ return "姓名是 $e[name],电子邮件是 $e[email],谢谢"; }$c = array_map("show_Names", $_POST['item']); print_r($c); - Jeche

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
我也遇到了这个问题。给出3个输入:field [],field2 [],field3 []。
您可以动态访问每个字段。由于每个字段都是一个数组,相关的字段将共享相同的数组键。例如,给定输入数据:
Bob,bob@bob.com,male Mark,mark@mark.com,male Bob和他的电子邮件和性别将共享相同的键。考虑到这一点,您可以像这样在for循环中访问数据:
    for($x = 0; $x < count($first_name); $x++ )
    {
        echo $first_name[$x];
        echo $email[$x];
        echo $sex[$x];
        echo "<br/>";
    }

这也可以很好地扩展。您只需要在需要添加新字段时添加相应的数组变量即可。

2

你可以使用一个 fieldset 数组:

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

我添加了一个隐藏字段来计算字段集的数量。用户可以添加或删除字段,然后保存它。

0

已经是一个数组了。 我的输入是:

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

在 $_POST 数据中,返回以下内容:
[name] => Array
    (
        [0] => 'joe'
        [1] => 'jose'
    )
[lastname] => Array
    (
        [0] =>  'doe'
        [1] => 'morrison'
    )

您可以通过以下方式访问这些数据:

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

这种方法非常适用于创建数据透视表。


1
请仅在您有新的独特内容要添加到页面时发布新答案。 - mickmackusa

0

这是一个简单的问题:

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

需要解释一下。例如,什么是想法/要点?请通过编辑(更改)您的答案进行回复,而不是在评论中(不带“编辑:”,“更新:”或类似内容 - 答案应该看起来像今天写的)。 - Peter Mortensen

0

然而,VolkerK的解决方案是避免电子邮件和用户名之间失配的最佳方法。因此,您必须使用PHP生成类似于以下的HTML代码:

<? 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方法发送的。

-4

使用这种方法应该可以正常工作:

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

逐步解释您的答案。 - krisdestruction
需要解释一下。例如,什么是想法/要点?请通过编辑(更改)您的答案进行回复,而不是在此处进行评论(不带“编辑:”,“更新:”或类似内容 - 答案应该看起来像今天写的)。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接