我可以将数组作为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';
答案 0 :(得分:203)
有一个非常简单的解决方案: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
。
答案 1 :(得分:55)
修改:不要错过上面的Stefan解决方案,它使用非常方便的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 + (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 (回调)
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));
答案 2 :(得分:10)
最简单的方法是使用serialize
功能。
它序列化任何变量以进行存储或传输。您可以在php manual - serialize
中阅读相关内容可以使用unserialize
所以在传递给您使用的URL时:
$url = urlencode(serialize($array))
并恢复您使用的变量
$var = unserialize(urldecode($_GET['array']))
虽然要小心。 GET请求的最大大小限制为4k,您可以通过在URL中传递数组来轻松超过。
此外,它真的不是最安全的数据传递方式!您应该考虑使用会话。
答案 3 :(得分:6)
请在输出(urlencode
)时转义您的变量。
你不能只打印一个数组,你必须以某种方式使用循环来构建你的网址
$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);
}
答案 4 :(得分:3)
<?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
通过网址传递给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
答案 5 :(得分:3)
我使用序列化数据base64编码。我想是最好也是最小的方式。 urlencode会浪费太多空间而你只有4k。
答案 6 :(得分:0)
这不是直接答案,因为这已经得到了解答,但是每个人都在谈论发送数据,但没有人真正说出你到达那里时做了什么,我花了半个小时才完成工作出来。所以我想我会在这里帮忙。
我会重复这一点
$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'];
答案 7 :(得分:0)
**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'];
答案 8 :(得分:0)
在收到的页面中,您可以使用:
parse_str($ str,$ array); var_dump($ array);
答案 9 :(得分:0)
这是解决此问题的另一种方法。
$data = array(
1,
4,
'a' => 'b',
'c' => 'd'
);
$query = http_build_query(array('aParam' => $data));
答案 10 :(得分:0)
您可以将 urlencoded 与 json_encode
结合使用示例:
<?php
$cars = array
(
[0] => array
(
[color] => "red",
[name] => "mustang",
[years] => 1969
),
[1] => array
(
[color] => "gray",
[name] => "audi TT",
[years] => 1998
)
)
echo "<img src='your_api_url.php?cars=" . urlencode(json_encode($cars)) . "'/>"
?>
祝你好运! ?
答案 11 :(得分:0)
很容易将数组作为参数发送。
用户 serialize
函数如下所述
$url = www.example.com
$array = array("a" => 1, "b" => 2, "c" => 3);
将数组作为参数发送
$url?array=urlencode(serialize($array));
在函数或其他端获取参数使用unserialize
$param = unserialize(urldecode($_GET['array']));
echo '<pre>';
print_r($param);
echo '</pre>';
Array
(
[a] => 1
[b] => 2
[c] => 3
)