2011-08-26 61 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