2011-08-26 19 views
35

如何通过$ _GET将一个或多个数组变量传递给另一个页面?

我总是在形式?a=1&b=2&c=3

讲什么关于通过a=[1,2,3]变量值?

我是否需要编写for循环并追加所有值?

感谢

+0

[传递数组作为url参数]的可能重复(http://stackoverflow.com/questions/1763508/passing-arrays-as-url-parameter) –

回答

79

可以使用[]语法通过_GET传递数组:

?a[]=1&a[]=2&a[]=3 

PHP懂得这个语法,所以$_GET['a']将等于array(1, 2, 3)

您也可以指定键:

?a[42]=1&a[foo]=2&a[bar]=3 

多维数组工作太:

?a[42][b][c]=1&a[foo]=2 

http_build_query()自动执行此操作:

http_build_query(array('a' => array(1, 2, 3))) // "a[]=1&a[]=2&a[]=3" 

http_build_query(array(
    'a' => array(
     'foo' => 'bar', 
     'bar' => array(1, 2, 3), 
    ) 
)); // "a[foo]=bar&a[bar][]=1&a[bar][]=2&a[bar][]=3" 

另一种方法是通过JSON编码的数组:

?a=[1,2,3] 

而且你可以解析ajson_decode

$a = json_decode($_GET['a']); // array(1, 2, 3) 

并与json_encode再次对其进行编码:

json_encode(array(1, 2, 3)); // "[1,2,3]" 

不要用不完serialize()为此目的。 Serialize允许序列化对象,并且有办法让它们执行代码。所以你不应该反序列化不可信的字符串。

+1

json的+1。只要确保你urlencode你的json数组来计数xss – knittl

+0

'urlencode()'不是反击xss的方法。 'htmlspecialchars()'是。但是任何人都应该已经'htmlspecialchars()'他输出的所有内容。 – arnaud576875

+0

@arnoud:在属性中使用urlencode是安全的。当传递一个url时,你希望它为urls编码,而不是标记(想'href =“”') – knittl

5

您可以将关联数组传递给http_build_query(),并将生成的字符串作为查询字符串追加到URL。该数组将自动由PHP解析,因此$_GET在接收页面上将包含一个数组。

$query_str = http_build_query(array(
    'a' => array(1, 2, 3) 
)); 
0

仅仅是重复$_GET变量是这样的:name=john&name=lea

这给你一个array

我曾经相信它会被覆盖!

+2

这是不正确的。重复参数*会覆盖。您必须在每个“名称”部分包含括号以获取数组。至少,这是PHP 5.3+上发生的情况。 –

3
$city_names = array(
    'delhi', 
    'mumbai', 
    'kolkata', 
    'chennai' 
); 
$city_query = http_build_query(array('city' => $city_names)); 

这会给你:

city[0]=delhi&city[1]=mumbai&city[2]=kolkata&city[3]=chennai 
如果要编码的支架也然后使用下面的代码

$city_query = urlencode(http_build_query(array('city' => $city_names))); 

输出:

city%255B0%255D%3Ddelhi%26city%255B1%255D%3Dmumbai ..... 

参考:http_build_queryurlencode

+0

简短而有帮助。 +1 – Siraj