使用HTML表单隐藏元素传递数组


78

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

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

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


1
您需要以某种方式对其进行序列化。检查序列化和json_encode函数。我建议使用json_encode。
瞪羚

Answers:


118

使用:

$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 [[]]”吗?
塞缪尔·吉文森

1
@SamuelGiftson可能会这样 name="result[][]"
Nurkartiko

38

主要有两种方法可以实现此目的:

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

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

然后,您可以使用取消序列化发布的值unserialize($postvalue)。有关此的更多信息,请参见PHP手册

Alternativeley您可以使用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()then检索数组。但是请注意,您不应使用出现在数组值中的字符进行分隔(或将其转义),并且不能使用此方法传输数组键。

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

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

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

这些方法的每个人都有自己的优点和缺点。使用的方法主要取决于数组的大小,因为您应该尝试使用所有这些方法发送最少的数据。

实现此目的的另一种方法是将数组存储在服务器端会话中,而不是在客户端传输它。这样,您可以通过$_SESSION变量访问数组,而不必通过表单传输任何内容。为此,请查看php.net上会话的基本用法示例


我必须在value属性周围使用单引号。否则,将在序列化版本的第一个双引号处修剪数据。
VeeK

我使用json_encode做到了这一点。对于第二个参数json_decode必须是在我的情况真的(为默认返回,而不是一个StdClass关联数组)
贾米勒

21

您可以从客户端使用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更好,您可以将对象传递到数组和多
级数组中

这个答案没有得到足够的认可。 只需使用序列化()或json_encode()的事情,大多数人都尝试过,并实现故障引号由他们在这里得到了时间的基础上。这个答案更进一步,并以一种优雅的方式使该问题变得无关紧要的方式对其进行了编码。 太棒了!
卡吉(Kaji)

谢谢,这正是我一直在寻找的东西。一句话。$ postvalue = base64_encode(serialize($ array)); 应该是$ postvalue = base64_encode(serialize($ postvalue));
阿纳塔克

9

序列化:

$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'])


serialize可以弄乱您的引号或括号,并与html混用。我将使用接受的答案
zachu 2015年

1

如果要发布数组,则必须使用另一种表示法:

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

这样,您将获得三个名称为result []的输入字段,并且在发布时$_POST['result']将是一个数组


1
<input type="hidden" name="item[]" value="[anyvalue]">

使其处于重复模式,它将以数组的形式发布此元素,并使用

print_r($_POST['item'])

取回物品


1

最好先编码为JSON字符串,然后再以Base64编码,例如,在服务器端以相反的顺序进行编码:首先使用base64_decode,然后使用json_decode函数。因此,您将还原PHP数组。


-1

您可以这样做:

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

6
或只使用爆破;-)
亚历克斯(Alex)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.