为什么这个PHP函数“忘记”了?参数


Why this PHP function "forgets" parameters?

我编写了这个函数的实现,用于将数组转换为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

发生了什么,如何解决它?

if ($v) {是你的问题。0的计算结果为false,因此将被跳过。

我建议去掉if,它是不需要的。

如果你想使用它,已经有一个本地PHP函数:

http_build_query

从关联的(或索引的)数组提供。

http://php.net/manual/en/function.http-build-query.php

演示:http://codepad.org/EtqXSGrH

在PHP中,0的值为False,所以当你检查if ($v) {时,它的值为False,并且不会执行它下面的代码块。

可以改成

if (!empty($v) || $v == 0)

这是因为您的$arraysourcetype的值为0