我已经完成了将数组转换为URL的函数实现。它似乎是正确的,事实上,它在很多情况下都能很好地工作,除非我传递一个值为0的数组值。这是功能:
function strtourl($arr, $entity = true, $prefix = '') {
$params = array();
foreach ($arr as $k => $v)
if ($v) {
$params[] = is_array($v) ? strtourl($v, $entity, $prefix ? $prefix.'['.$k.']' : $k) :
sprintf($prefix ? $prefix.'[%s]' : '%s', urlencode($k)).'='.urlencode($v);
}
return implode($entity ? '&' : '&', $params);
}
这是我正在使用的一个例子:
$array = array(
'type' => 0,
'content' => array(
'msg_id' => 'XSS120',
'source' => 0,
'dest' => 4,
'type' => 0,
'msg' => 'message'
)
);
返回此字符串:
content[msg_id]=XSS120&content[dest]=4&content[msg]=message
而不是:
type=0&content[msg_id]=XSS120&content[source]=0&content[dest]=4&content[type]=0&content[msg]=message
发生了什么以及如何解决?
答案 0 :(得分:8)
if ($v) {
是你的问题。 0的计算结果为false,因此它被跳过。
我建议删除if
,这是不需要的。
答案 1 :(得分:3)
如果你想使用它,已经有了一个本机PHP函数:
http_build_query
从关联(或索引)生成URL编码的查询字符串 数组提供。
答案 2 :(得分:1)
在PHP中,零的计算结果为False,因此当您检查if ($v) {
时,它的计算结果为false,并且不会执行它下面的代码块。
您可以将其更改为
if (!empty($v) || $v == 0)
答案 3 :(得分:0)
这是因为0
中source
和type
的值$array
。