如何在PHP中传递GET中的数组?

时间:2011-02-23 23:02:01

标签: php arrays

$idArray = array(1,2,3,4);

我可以用HTML写这行吗?

<form method='POST' action='{$_SERVER['PHP_SELF']}?arr={$idArray}'>

或者我应该写:

<form method='POST' action='{$_SERVER['PHP_SELF']}?arr[]={$idArray}'>

如何通过?

我应该如何在被调用的页面中处理它?<​​/ p> 谢谢!!

12 个答案:

答案 0 :(得分:43)

如果要将数组作为参数传递,则必须为每个元素添加一个参数。您的查询字符串将变为:

?arr[]=1&arr[]=2&arr[]=3&arr[]=4

正如其他人所写,你也可以序列化反序列化数组。

但是你真的必须再次将数据发送给客户端吗?您似乎只需要一种方法在请求之间保留数据

在这种情况下,最好使用sessions(docs)。这也更安全,否则客户端可以修改数据。

答案 1 :(得分:8)

使用serializeunserialize PHP函数。 此函数为您提供可存储(字符串)版本的数组类型。 有关使用情况的更多信息,请阅读 http://php.net/manual/en/function.serialize.phphttp://www.php.net/manual/en/function.unserialize.php

答案 2 :(得分:3)

另一个选择(即使看起来不错,我也会说):

<form method='POST'>
  <input type="hidden" name="idArray[]" value="1" />
  <input type="hidden" name="idArray[]" value="2" />
  <input type="hidden" name="idArray[]" value="3" />
  <input type="hidden" name="idArray[]" value="4" />
</form>

但当然它会以POST方式发送。我不推荐使用serialize发送它,因为该函数的输出可能会变得很大,并且长度或URL是有限的。

答案 3 :(得分:3)

您可以使用序列化和&amp;与urlencode一起序列化 e.g。

发送时你可以像这样发送:

<?php
$array1 = Array(["key1"]=>"value1",["key2"]=>"value2");
$array2 = Array(["key1"]=>"value1",["key2"]=>"value2");
$data1="textdata";

$urlPortion= '&array1='.urlencode(serialize($array1)).
             '&array2='.urlencode(serialize($array2)).
             '&data1='.urlencode(serialize($data1));
//Full URL:
$fullUrl='http://localhost/?somevariable=somevalue'.$urlPortion
?>

在接收时,您可以按以下方式访问它们:

<?php
$destArray1=unserialize($_GET['array1']);
$destArray2=unserialize($_GET['array2']);
$destData1=unserialize($_GET['data1']);
?>

而且,Voila,您可以将该网址附加到ajax请求或普通浏览器页面上。

答案 4 :(得分:3)

只需使用explode()并传递它的值即可。您可以使用implode()来恢复数组。

注意:根据数组中不存在的内容类型选择分隔符。例如。如果您确定数组中没有逗号(,),请选择逗号作为分隔符。

答案 5 :(得分:2)

使用parse_str函数

$str = "first=value&arr[]=foo+bar&arr[]=baz"; 
parse_str($str); 
echo $first;  

答案 6 :(得分:1)

http://snipplr.com/view/4444/passing-an-array-through-get-request/

$str=serialize($idArray);
<form method='POST' action='{$_SERVER['PHP_SELF']}?arr=$str'>

要在接收页面中获取数据,您首先必须:

<?PHP 
 $idArray = unserialize($_GET["arr"]); 
?>

答案 7 :(得分:0)

在您提到的特定情况下,我会将数组内爆为字符串,然后在发布表单时将其展开。

$str = rawurlencode(implode(",",$idArray));

<form method='POST' action='{$_SERVER['PHP_SELF']}?arr={$str}'>

然后进行后期处理:

 $idArray = explode(",",rawurldecode($_POST['arr']));

答案 8 :(得分:0)

首先

serialize()你的数组然后通过它。然后在其上调用unserialize()http://ie.php.net/serialize

答案 9 :(得分:0)

会话是一种更安全,更清洁的方法。通过以下方式开始您的会话:

session_start();

然后将序列化数组添加为会话变量,如下所示:

$_SESSION["venue"] = serialize($venue);

只需在需要时调用会话变量即可。

答案 10 :(得分:0)

Felix's answer很好地回答了这个问题,但我认为缺少示例。

此答案由对Felix答案的评论提示。

  

您可以使用此方法指定密钥吗? – Qwerty 2014年4月27日,0:05

首先,说明费利克斯的答案:

<input type="hidden" name="array[]" value="val1" />
<input type="hidden" name="array[]" value="val2" />
<input type="hidden" name="array[]" value="val3" />

请求发送到服务器后,其类型为Array

以下是带有键的示例。这将为您提供一个包含两个键的数组,每个键两个值。

<input type="hidden" name="array['first']" value="val1" />
<input type="hidden" name="array['first']" value="val2" />
<input type="hidden" name="array['second']" value="val3" />
<input type="hidden" name="array['second']" value="val4" />

最后,这是VueJS的示例,这是我撰写本文时使用的示例,这使我想到了这个问题。

<input v-for="(value, key) in data" type="hidden" :name="'array[' + key + ']'" :value="value">

我希望这对任何路人都有帮助。

答案 11 :(得分:0)

另一种选择是先 json_encode 然后 base64_encode 然后 urlencode 然后将其传递到get请求中。

$idArray = [1,2,3,4];
$urlArray = urlencode(base64_encode(json_encode($idArray)));
$fullURL = 'https://myserver/mypath/myscript.php?arr=' . $urlArray;

收到后,您可以通过 urldecode 然后 base64_decode 然后 json_decode 返回原始数组。

$idArray = json_decode(base64_decode(urldecode($_GET["arr"])));

就像其他人提到的那样,您可以使用 serialize unserialize ,但是使用 json_encode json_decode认为更安全。从PHP7开始, unserialize 还有第二个参数,有关更多信息,请参见https://github.com/kalessil/phpinspectionsea/blob/master/docs/security.md#exploiting-unserialize

您可能不需要使用 base64_encode base64_decode ,但我建议您使用。这将花费您一些处理资源,但会导致URL较短,从而节省了网络资源。请记住,如果您使用大型阵列,则可能会超出服务器的get请求所允许的长度限制。