6

http_build_query を使用してこの URL を作成したい:

https://www.googleapis.com/freebase/v1/topic/m/0d6lp?filter=/common/topic/notable_for&filter=/common/topic/alias

2 つのフィルターを指定するために、"filter=" パラメーターが URL に 2 回含まれていることに注意してください。

私はこの方法でそれをやろうとしましたが、問題がありました:

$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);

問題は、'filter' 配列キーが 2 回繰り返され、最後のパラメーターのみが http_build_query に表示されることです。2 つのフィルターを使用して元の URL を作成するにはどうすればよいですか?

4

4 に答える 4

7

もちろん、ここでの問題は、PHP 配列 (ハッシュ) 内のすべてのキーが 1 つの値しか持てないことです。本質的に、クエリ文字列には順序があり、キーの一意性に関する制約がないため、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();
    }
}

使用例 ( Codepad Demo ):

$qs = new QueryString();
$qs->add('filter', '1');
$qs->add('filter', '2');
var_dump($qs->build()); // filter=1&filter=2
于 2013-06-18T05:39:08.360 に答える
0
  1. 1 つのインデックスで 2 つ以上の値を accoc 配列に格納することはできません。
  2. APIは次のような値を取りませんfilter[]

したがって、そのクエリを作成する独自の関数を作成することをお勧めします。

于 2013-06-18T05:25:27.960 に答える
0

最善の解決策ではありませんが、回避策があります。

$item = [
   'key1' => array('value1','value2'),
   'key2' => array('value3','value4')
];

$array=[
    'aaa' => 'aaa',
    'null' => 'null&'.preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', http_build_query($item,null,'&')),
    'zzz' => 'zzz'
];

echo urldecode(http_build_query($array));

出力:

aaa=aaa&null=null&key1=value1&key1=value2&key2=value3&key2=value4&zzz=zzz

警告:おそらくこれは動作しないため、URL は次のようになります:

aaa=aaa&null=null%26key1%3Dvalue1%26key1%3Dvalue2%26key2%3Dvalue3%26key2%3Dvalue4&zzz=zzz

編集: 他のオプションは、URL に割り当てる前に結果を preg します:

preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', http_build_query($item))

出力:

キー1=値1&キー1=値2&キー2=値3&キー2=値4

于 2015-05-26T08:25:14.477 に答える