Передача массивов в качестве параметра url

Каков наилучший способ передать массив как параметр url? Я думал, если это возможно:

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

или как об этом:

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

Я читал примеры, но я нахожу это беспорядочным:

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

Существует очень простое решение: http_build_query() . Он принимает ваши параметры запроса как ассоциативный массив:

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

вернется

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

http_build_query() обрабатывает все необходимое экранирование для вас ( %5B => [ и %5D => ] ), поэтому эта строка равна aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d .

Изменить: не пропустите решение Stefan выше, которое использует очень http_build_query() функцию http_build_query() : https://stackoverflow.com/a/1764199/179125

knittl находится прямо на побеге. Однако есть более простой способ сделать это:

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

Если вы хотите сделать это с помощью ассоциативного массива, попробуйте это вместо этого:

PHP 5.3+ (функция лямбда)

 $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 (обратный вызов)

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

Самый простой способ – использовать функцию serialize .

Он сериализует любую переменную для хранения или передачи. Вы можете прочитать об этом в руководстве по php – сериализуете

Переменная может быть восстановлена ​​с помощью unserialize

Поэтому при передаче URL, который вы используете:

$url = urlencode(serialize($array))

и для восстановления используемой переменной

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

Однако будьте осторожны. Максимальный размер запроса GET ограничен 4k, что вы можете легко преодолеть, передав массивы в URL-адресе.

Кроме того, это действительно не самый безопасный способ передачи данных! Вероятно, вам следует изучить использование сеансов.

избегайте переменные при выводе ( urlencode ).

и вы не можете просто распечатать массив, вы должны каким-то образом создать свой URL-адрес

 $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); } 

Я делаю это с последовательной кодировкой базы данных64. Лучший и наименьший способ, я думаю. urlencode – это много тратить пространство, и у вас всего 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";}

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 

Поэтому, если вы хотите передать этот $array через URL-адрес на page_no_2.php ,

например: –

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

Чтобы вернуться к исходному массиву, он должен быть urldecode() , а затем unserialize() , как это в 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" } 

снова: D

Это не прямой ответ, так как об этом уже был дан ответ, но все говорили о отправке данных, но никто не сказал, что вы делаете, когда он туда доберется, и мне понадобилось полчаса, чтобы разобраться. Поэтому я подумал, что помогу здесь.

Я повторю этот бит

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

Очевидно, вы отформатировали бы это лучше, чем это http://www.someurl.com?x=$query

И чтобы вернуть данные

 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" <p><a href=\"index2.php?data=".$url."\"> Send </a><br /> </p>"; **in received page** parse_str($_GET['data']); echo $myArray['car']; echo '<br/>'; echo $myArray['model'];