Passando matrizes como parâmetro de URL

Qual é a melhor maneira de transmitir um array como um parâmetro de URL? Eu estava pensando se isso é possível:

$aValues = array(); $url = 'http://www.example.com?aParam='.$aValues; 

ou sobre isso:

 $url = 'http://www.example.com?aParam[]='.$aValues; 

Eu li exemplos, mas acho confuso:

 $url = 'http://www.example.com?aParam[]=value1&aParam[]=value2&aParam[]=value3'; 

Existe uma solução muito simples: http_build_query() . Leva seus parâmetros de consulta como uma matriz associativa:

 $data = array( 1, 4, 'a' => 'b', 'c' => 'd' ); $query = http_build_query(array('aParam' => $data)); 

retornará

 string(63) "aParam%5B0%5D=1&aParam%5B1%5D=4&aParam%5Ba%5D=b&aParam%5Bc%5D=d" 

http_build_query() trata de todos os escapes necessários para você ( %5B => [ e %5D => ] ), então esta string é igual a aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d .

Edit: Não perca a solução de Stefan acima, que usa a function http_build_query() muito útil: https://stackoverflow.com/a/1764199/179125

Knittl está certo sobre escaping. No entanto, existe uma maneira mais simples de fazer isso:

 $url = 'http://example.com/index.php?'; $url .= 'aValues[]=' . implode('&aValues[]=', array_map('urlencode', $aValues)); 

Se você quiser fazer isso com um array associativo, tente isto:

PHP 5.3+ (function lambda)

 $url = 'http://example.com/index.php?'; $url .= implode('&', array_map(function($key, $val) { return 'aValues[' . urlencode($key) . ']=' . urlencode($val); }, array_keys($aValues), $aValues) ); 

PHP <5,3 (retorno de chamada)

 function urlify($key, $val) { return 'aValues[' . urlencode($key) . ']=' . urlencode($val); } $url = 'http://example.com/index.php?'; $url .= implode('&', array_map('urlify', array_keys($aValues), $aValues)); 

A maneira mais fácil seria usar a function serialize .

Ele serializa qualquer variável para armazenamento ou transferência. Você pode ler sobre isso no manual do php – serializar

A variável pode ser restaurada usando unserialize

Então, na passagem para o URL que você usa:

$url = urlencode(serialize($array))

e restaurar a variável que você usa

$var = unserialize(urldecode($_GET['array']))

Tenha cuidado aqui embora. O tamanho máximo de uma solicitação GET é limitado a 4k, que você pode exceder facilmente passando matrizes em uma URL.

Além disso, não é realmente a maneira mais segura de passar dados! Você provavelmente deve procurar usar sessões em vez disso.

por favor, escape suas variables ​​ao produzir ( urlencode ).

e você não pode simplesmente imprimir uma matriz, você tem que construir sua URL usando um loop de alguma forma

 $url = 'http://example.com/index.php?' $first = true; foreach($aValues as $key => $value) { if(!$first) $url .= '&amp'; else $first = false; $url .= 'aValues['.urlencode($key).']='.urlencode($value); } 

Eu faço isso com dados serializados codificados em base64. Melhor e menor caminho, eu acho. urlencode é muito espaço desperdiçado e você tem apenas 4k.

  < ?php $array["a"] = "Thusitha"; $array["b"] = "Sumanadasa"; $array["c"] = "Lakmal"; $array["d"] = "Nanayakkara"; $str = serialize($array); $strenc = urlencode($str); print $str . "\n"; print $strenc . "\n"; ?> 

print $str . "\n";a:4:{s:1:"a";s:8:"Thusitha";s:1:"b";s:10:"Sumanadasa";s:1:"c";s:6:"Lakmal";s:1:"d";s:11:"Nanayakkara";} e

print $strenc . "\n";

 a%3A4%3A%7Bs%3A1%3A%22a%22%3Bs%3A8%3A%22Thusitha%22%3Bs%3A1%3A%22b%22%3Bs%3A10%3A%22Sumanadasa%22%3Bs%3A1%3A%22c%22%3Bs%3A6%3A%22Lakmal%22%3Bs%3A1%3A%22d%22%3Bs%3A11%3A%22Nanayakkara%22%3B%7D 

Então, se você quiser passar este $array através de URL para page_no_2.php ,

ex:-

 $url ='http://page_no_2.php?data=".$strenc."'; 

Para retornar ao array original, ele precisa ser urldecode() , depois unserialize() , assim em page_no_2.php:

  < ?php $strenc2= $_GET['data']; $arr = unserialize(urldecode($strenc2)); var_dump($arr); ?> 

  array(4) { ["a"]=> string(8) "Thusitha" ["b"]=> string(10) "Sumanadasa" ["c"]=> string(6) "Lakmal" ["d"]=> string(11) "Nanayakkara" } 

novamente: D

Esta não é uma resposta direta, já que isso já foi respondido, mas todos estavam falando sobre o envio dos dados, mas ninguém realmente disse o que você faz quando chega lá, e levei uma boa meia hora para resolver o problema. Então eu pensei em ajudar aqui.

Vou repetir isso

 $data = array( 'cat' => 'moggy', 'dog' => 'mutt' ); $query = http_build_query(array('mydata' => $data)); $query=urlencode($query); 

Obviamente você formataria melhor que isso http://www.someurl.com?x=$query

E para obter os dados de volta

 parse_str($_GET['x']); echo $mydata['dog']; echo $mydata['cat']; 
 **in create url page** $data = array( 'car' => 'Suzuki', 'Model' => '1976' ); $query = http_build_query(array('myArray' => $data)); $url=urlencode($query); echo" 

Send

"; **in received page** parse_str($_GET['data']); echo $myArray['car']; echo '
'; echo $myArray['model'];