http_build_query具有相同的名称参数

ent*_*pid 21 php url http

有没有办法http_build_query使用具有相同名称的参数自动构建查询?

如果我做的事情

array('foo' => 'x', 'foo' => 'y');
Run Code Online (Sandbox Code Playgroud)

它们显然在数组中被覆盖,但即使我这样做:

array('foo' => array('x', 'y'));
Run Code Online (Sandbox Code Playgroud)

该函数创建了类似的东西foo[0]=x&foo[1],这不是我想要的,因为我需要这种格式的参数foo=x&foo=y.

Jas*_*ell 37

这应该做你想要的,我有一个需要同样的api.

$vars = array('foo' => array('x','y'));
$query = http_build_query($vars, null, '&');
$string = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', $query); //foo=x&foo=y
Run Code Online (Sandbox Code Playgroud)


Kod*_*son 5

这是我创建的一个函数,用于构建查询并保留名称。我创建它是为了与需要多个具有相同名称的查询字符串参数的第三方 API 一起使用。

function custom_build_query($query_data) {
    $query = array();
    foreach ($query_data as $name => $value) {
        $value = (array) $value;
        array_walk_recursive($value, function($value) use (&$query, $name) {
            $query[] = urlencode($name) . '=' . urlencode($value);
        });
    }
    return implode("&", $query);
}
Run Code Online (Sandbox Code Playgroud)

用法:

echo custom_build_query(['a' => 1, 'b' => 2, 'c' => [3, 4]]);
Run Code Online (Sandbox Code Playgroud)

输出:

function custom_build_query($query_data) {
    $query = array();
    foreach ($query_data as $name => $value) {
        $value = (array) $value;
        array_walk_recursive($value, function($value) use (&$query, $name) {
            $query[] = urlencode($name) . '=' . urlencode($value);
        });
    }
    return implode("&", $query);
}
Run Code Online (Sandbox Code Playgroud)