【问题标题】:How to get a form input array into a PHP array如何将表单输入数组转换为 PHP 数组
【发布时间】:2011-03-19 21:05:00
【问题描述】:

我有一个类似下面的表单,它发布到 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,谢谢

【问题讨论】:

    标签: php arrays forms


    【解决方案1】:

    它们已经在数组中:$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[],我怎么能添加呢?
    • 基本上,您只需扩展模式。请参阅上面的编辑...当您从 $_POST 分配它们时,任何其他输入也将是数组(假设在 html 中有多个具有该名称的输入,就像您对这些字段所做的那样)。
    • 杰弗里,我想知道我是否可以相信数组的顺序。也就是说,我们确定$emails[1] 对应于名为$name[1] 的用户吗?我想我过去遇到过这个问题,但我可能错了。谢谢
    • @bruciasse - 服务器处理像这样的输入数组的方式会因一个 Web 服务器而异(不同的操作系统在处理像这样的细粒度细节时会有所不同),但是每个平台我已采用这些技术在其内部是一致的(即每次的排序都是相同的)。在将请求传递给服务器之前,浏览器可能会混淆请求变量的顺序,但我认为这很不寻常。您可能面临的最后一个问题是 html 以奇怪的顺序混合和 CSS 调整
    • ...定位。如果您的页面是这样的,它肯定会看到一些奇怪的数组排序问题。
    【解决方案2】:

    例如通过命名字段,如

    <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 function show_Names($e) { return "The name is $e[name] and email is $e[email],谢谢你"; } $c = array_map("show_Names", $_POST['item']); print_r($c);
    【解决方案3】:

    你可以这样做:

    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)
    

    【讨论】:

      【解决方案4】:

      我也遇到过这个问题。给定 3 个输入:field[]、field2[]、field3[]

      您可以动态访问这些字段中的每一个。由于每个字段都是一个数组,因此相关字段将共享相同的数组键。例如,给定输入数据:

      • 鲍勃,bob@bob.com,男
      • 马克,mark@mark.com,男

      Bob 和他的电子邮件和性别将共享同一个密钥。考虑到这一点,您可以像这样在 for 循环中访问数据:

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

      这也可以扩展。您需要做的就是在需要添加新字段时添加各自的数组变量。

      【讨论】:

        【解决方案5】:

        您可以使用一组字段集:

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

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

        【讨论】:

          【解决方案6】:

          然而,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 方法发送的。

          【讨论】:

            【解决方案7】:

            这很简单:

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

            【讨论】:

            • 解释一下。例如,想法/要点是什么?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
            【解决方案8】:

            使用此方法应该可以:

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

            【讨论】:

            • 一步一步解释你的答案
            • 解释一下。例如,想法/要点是什么?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
            猜你喜欢
            • 2015-08-29
            • 2012-06-22
            • 1970-01-01
            • 2017-03-29
            • 1970-01-01
            • 1970-01-01
            • 2020-01-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多