PHP http_build_query有两个相同的数组键

Nin*_*nja 5 php

我想使用http_build_query构建此url:

https://www.googleapis.com/freebase/v1/topic/m/0d6lp?filter=/common/topic/notable_for&filter=/common/topic/alias
Run Code Online (Sandbox Code Playgroud)

请注意,"filter ="参数在url中出现两次,以指定两个过滤器.

我尝试这样做但遇到问题:

$service_url = 'https://www.googleapis.com/freebase/v1/topic';
$mid = '/m/0d6lp';
$params = array('filter' => '/common/topic/notable_for', 'filter' =>   '/common/topic/alias');
$url = $service_url . $mid . '?' . http_build_query($params);
Run Code Online (Sandbox Code Playgroud)

问题是'filter'数组键重复两次,只有最后一个参数出现在http_build_query中.如何使用两个过滤器构建原始URL?

Bai*_*ker 7

这里的问题当然是PHP数组(哈希)中的每个键只能有一个值.从本质上讲,PHP哈希不是查询字符串的良好表示,因为查询字符串具有顺序,并且没有关于键的唯一性的约束.

要解决这个问题,您需要一个可以处理重复键的特殊查询字符串构建器:

class QueryString {
    private $parts = array();

    public function add($key, $value) {
        $this->parts[] = array(
            'key'   => $key,
            'value' => $value
        );
    }

    public function build($separator = '&', $equals = '=') {
        $queryString = array();

        foreach($this->parts as $part) {
            $queryString[] = urlencode($part['key']) . $equals . urlencode($part['value']);
        }

        return implode($separator, $queryString);
    }

    public function __toString() {
        return $this->build();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例(键盘演示):

$qs = new QueryString();
$qs->add('filter', '1');
$qs->add('filter', '2');
var_dump($qs->build()); // filter=1&filter=2
Run Code Online (Sandbox Code Playgroud)

  • @YogeshSuthar这是因为$ _GET是一个哈希(并且不能准确地表示查询字符串).当PHP解析QS时,它会覆盖重复项.如果你检查一个带有重复键的查询字符串(用于POST的`php:// input`或用于GET的'$ _SERVER ['QUERY_STRING']`),你可以提取这两个值.还要考虑像`filter []`这样的键,它将PHP聚合成一个数组.查询字符串允许多次设置键. (2认同)

sec*_*tus 0

  1. 您不能在 accoc 数组中使用一个索引存储两个或多个值。
  2. Api 不接受类似的值filter[]

因此,我建议您创建自己的函数来构建该查询。