Передача массивов в качестве параметра url - PullRequest
104 голосов
/ 19 ноября 2009

Как лучше всего передать массив в качестве параметра 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';

Ответы [ 8 ]

204 голосов
/ 19 ноября 2009

Существует очень простое решение: 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.

55 голосов
/ 19 ноября 2009

Редактировать: Не пропустите приведенное выше решение Стефана, в котором используется очень удобная функция http_build_query(): https://stackoverflow.com/a/1764199/179125

Книттл прав насчет побега. Однако есть более простой способ сделать это:

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

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));
10 голосов
/ 19 ноября 2009

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

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

Переменную можно восстановить с помощью unserialize

Таким образом, при переходе на URL, который вы используете:

$url = urlencode(serialize($array))

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

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

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

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

6 голосов
/ 19 ноября 2009

пожалуйста, экранируйте свои переменные при выводе (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);
}
4 голосов
/ 22 ноября 2013
 <?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

3 голосов
/ 08 мая 2014

Я делаю это с закодированной сериализованной базой данных64. Лучший и самый маленький способ, я думаю. urlencode занимает много места впустую, и у вас есть только 4 КБ.

0 голосов
/ 24 мая 2017
**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'];
0 голосов
/ 07 сентября 2016

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

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

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

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

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

parse_str($_GET['x']);
echo $mydata['dog'];
echo $mydata['cat'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...