Передача массивов в качестве параметра 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';
Ответы
Ответ 1
Существует очень простое решение: 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
.
Ответ 2
Изменить: Не пропустите решение Stefan выше, в котором используется очень удобная функция http_build_query()
: fooobar.com/questions/69545/...
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('&', array_map('urlify', array_keys($aValues), $aValues));
Ответ 3
Самый простой способ - использовать функцию serialize
.
Он сериализует любую переменную для хранения или передачи. Вы можете прочитать об этом в php manual - сериализовать
Эта переменная может быть восстановлена с помощью unserialize
Итак, переходя к URL-адресу, который вы используете:
$url = urlencode(serialize($array))
и для восстановления используемой переменной
$var = unserialize(urldecode($_GET['array']))
Будьте осторожны. Максимальный размер запроса GET ограничен 4k, что вы можете легко преодолеть, передав массивы в URL.
Кроме того, это действительно не самый безопасный способ передачи данных! Вероятно, вам следует изучить использование сеансов.
Ответ 4
пожалуйста, избегайте переменные при выводе (urlencode
).
и вы не можете просто напечатать массив, вам нужно построить свой url, используя какой-то цикл.
$url = 'http://example.com/index.php?'
$first = true;
foreach($aValues as $key => $value) {
if(!$first) $url .= '&';
else $first = false;
$url .= 'aValues['.urlencode($key).']='.urlencode($value);
}
Ответ 5
Я делаю это с кодировкой последовательной базы данных64. Лучший и наименьший способ, я думаю. urlencode - это много тратить пространство, и у вас всего 4k.
Ответ 6
<?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
,
ex: -
$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
Ответ 7
Это не прямой ответ, так как об этом уже был дан ответ, но все говорили о передаче данных, но никто не сказал, что вы делаете, когда он туда доберется, и мне понадобилось полчаса, чтобы работать вне. Поэтому я подумал, что помогу здесь.
Я повторю этот бит
$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'];
Ответ 8
**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'];