【问题标题】:Passing an array using an HTML form hidden element使用 HTML 表单隐藏元素传递数组
【发布时间】:2011-07-01 11:13:08
【问题描述】:

我正在尝试在隐藏字段中发布一个数组,并希望在 PHP 中提交表单后检索该数组。

$postvalue = array("a", "b", "c");
<input type="hidden" name="result" value="<?php echo $postvalue; ?>">

但是在打印发布的值后我只得到一个数组字符串。那我该如何解决呢?

【问题讨论】:

  • 您需要以某种方式对其进行序列化。查看 serialize 和 json_encode 函数。我建议使用 json_encode。

标签: php


【解决方案1】:

用途:

$postvalue = array("a", "b", "c");
foreach($postvalue as $value)
{
    echo '<input type="hidden" name="result[]" value="'. $value. '">';
}

你会得到$_POST['result']作为一个数组。

print_r($_POST['result']);

【讨论】:

  • 那么对于一个数组数组,名字会不会像这样 name="result[[]]" ?
  • @SamuelGiftson 可能是这样的name="result[][]"
【解决方案2】:

主要有两种可能的方式来实现这一点:

  1. 以某种方式序列化数据:

    $postvalue = serialize($array); // Client side
    
    $array = unserialize($_POST['result']; // Server side
    

然后您可以使用unserialize($postvalue) 对发布的值进行反序列化。更多信息请联系here in the PHP manuals

您可以使用 json_encode()json_decode() 函数来获取 JSON 格式的序列化字符串。您甚至可以使用gzcompress() 缩小传输的数据(请注意,这是性能密集型的)并使用base64_encode() 保护传输的数据(以使您的数据在非8 位清洁传输层中存活)这可能如下所示:

    $postvalue = base64_encode(json_encode($array)); // Client side

    $array = json_decode(base64_decode($_POST['result'])); // Server side

一种不推荐的序列化数据的方法(但性能非常便宜)是简单地在数组上使用implode() 来获取所有值由某个指定字符分隔的字符串。然后在服务器端,您可以使用explode() 检索阵列。但请注意,您不应该使用出现在数组值中的字符进行分隔(或转义),并且您不能使用此方法传输数组键。

  1. 使用特殊命名输入元素的属性:

    $postvalue = "";
    foreach ($array as $v) {
      $postvalue .= '<input type="hidden" name="result[]" value="' .$v. '" />';
    }
    

    这样,如果发送表单,您将在 $_POST['result'] 变量中获取整个数组。请注意,这不会传输数组键。但是,您可以通过使用 result[$key] 作为每个字段的名称来实现此目的。

这些方法中的每一种都有自己的优点和缺点。您使用什么主要取决于您的数组有多大,因为您应该尝试使用所有这些方法发送最少量的数据。

实现相同目的的另一种方法是将数组存储在服务器端会话中,而不是在客户端传输它。像这样,您可以通过$_SESSION 变量访问数组,而不必通过表单传输任何内容。为此,请查看a basic usage example of sessions on php.net

【讨论】:

  • 我必须在 value 属性周围使用单引号。否则,数据将在序列化版本的第一个双引号处被修剪。
  • 我是用 json_encode 做的。 json_decode 的第二个参数在我的情况下必须为真(返回关联数组而不是默认的 StdClass)
【解决方案3】:

您可以从客户端使用 serialize 和 base64_encode。之后,再在服务器端使用 unserialize 和 base64_decode。

喜欢:

在客户端,使用:

    $postvalue = array("a", "b", "c");
    $postvalue = base64_encode(serialize($array));

   // Your form hidden input
   <input type="hidden" name="result" value="<?php echo $postvalue; ?>">

在服务器端,使用:

    $postvalue = unserialize(base64_decode($_POST['result']));
    print_r($postvalue) // Your desired array data will be printed here

【讨论】:

  • 这应该是正确答案,比用foreach好,可以将对象传入数组,多级数组
  • 这个答案没有得到足够的信任。 Just 使用 serialize() 或 json_encode() 是大多数人在到达这里时已经尝试并意识到基于引号失败的事情。这个答案更进一步,并以一种优雅的方式使该问题无关紧要的方式对其进行编码。 太棒了!
  • 谢谢,这正是我想要的。一个小评论。 $postvalue = base64_encode(序列化($array));应该是 $postvalue = base64_encode(serialize($postvalue));
【解决方案4】:

要么序列化:

$postvalue=array("a","b","c");
<input type="hidden" name="result" value="<?php echo serialize($postvalue); ?>">

接收时:unserialize($_POST['result'])

或内爆:

$postvalue=array("a","b","c");
<input type="hidden" name="result" value="<?php echo implode(',', $postvalue); ?>">

收到时:explode(',', $_POST['result'])

【讨论】:

  • 序列化会弄乱你的引号或括号并与 html 混淆。我会使用接受的答案
【解决方案5】:

如果你想发布一个数组,你必须使用另一种表示法:

foreach ($postvalue as $value){
<input type="hidden" name="result[]" value="$value.">
}

这样你就有了三个名为 result[] 的输入字段,当发布时$_POST['result'] 将是一个数组

【讨论】:

    【解决方案6】:
    <input type="hidden" name="item[]" value="[anyvalue]">
    

    让它处于重复模式,它将把这个元素作为一个数组发布到表单中,并使用

    print_r($_POST['item'])
    

    检索项目

    【讨论】:

      【解决方案7】:

      最好先编码为 JSON 字符串,然后使用 Base64 编码,例如,在服务器端以相反的顺序:先使用 base64_decode,然后使用 json_decode 函数。所以你将恢复你的 PHP 数组。

      【讨论】:

        【解决方案8】:

        你可以这样做:

        <input type="hidden" name="result" value="<?php foreach($postvalue as $value) echo $postvalue.","; ?>">
        

        【讨论】:

          猜你喜欢
          • 2019-02-15
          • 1970-01-01
          • 2011-12-04
          • 1970-01-01
          • 2011-12-28
          • 1970-01-01
          • 1970-01-01
          • 2020-10-07
          • 1970-01-01
          相关资源
          最近更新 更多