php url查询没有索引的嵌套数组

时间:2012-08-16 22:53:51

标签: php arrays function

我正在使用第三方API,它接收几个必须按如下方式编码的参数:

text[]=Hello%20World&text[]=How%20are%20you?&html[]=<p>Just%20fine,%20thank%20you</p>

正如您所看到的,此API可以接受文本的多个参数,也可以接受HTML(不在示例调用中)。

我已经使用http_build_query为其他API正确构建查询字符串

$params['text'][] = 'Hello World';
$params['text'][] = 'How are you?';
$params['html'][] = '<p>Just fine, thank you</p>';

$http_query = http_build_query($params);

这种方法的问题是它将使用数字索引构建一个查询字符串:

text[0]=Hello%20World&text[1]=How%20are%20you?&html[0]=<p>Just%20fine,%20thank%20you</p>

不幸的是,我正在使用的API不喜欢数字索引并且失败。

是否有任何php函数/类方法可以帮助我快速构建这样的查询?

谢谢

4 个答案:

答案 0 :(得分:10)

我不知道一种标准的方法(我认为没有这种方式),但这是一个丑陋的解决方案:

由于[]http_build_query编码,您可以生成带索引的字符串,然后替换它们。

preg_replace('/(%5B)\d+(%5D=)/i', '$1$2', http_build_query($params));

答案 1 :(得分:4)

我非常同意RiaD的答案,但你可能会遇到这些代码的一些问题(抱歉,由于缺乏代表,我不能只是将其作为评论)。

首先,据我所知http_build_query返回一个urlencode()'d字符串,这意味着你不会[和]而是你将拥有%5B和%5D。

其次,PHP的PCRE引擎将'['字符识别为字符类的开头而不仅仅是一个简单的'['(PCRE Meta Characters)。这最终可能会使用'[]'替换您请求中的所有数字。

你更可能想要这样的东西:

preg_replace('/\%5B\d+\%5D/', '%5B%5D', http_build_query($params));

在这种情况下,您需要转义%字符,因为它们也具有特殊含义。如果您有一个包含实际括号而不是转义符的字符串,请尝试:

preg_replace('/\[\d+\]/', '[]', $http_query);

答案 2 :(得分:3)

使用http_build_query似乎无法做到这一点。抱歉。但是在文档页面上,有人有这个:

function cr_post($a,$b=0,$c=0){
    if (!is_array($a)) return false;
    foreach ((array)$a as $k=>$v){
        if ($c) $k=$b."[]"; elseif (is_int($k)) $k=$b.$k;
        if (is_array($v)||is_object($v)) {
            $r[]=cr_post($v,$k,1);continue;
        }
        $r[]=urlencode($k)."=" .urlencode($v);    
    }
    return implode("&",$r);
}


$params['text'][] = 'Hello World';
$params['text'][] = 'How are you?';
$params['html'][] = '<p>Just fine, thank you</p>';

$str = cr_post($params);
echo $str;

我还没有测试过。如果它不起作用那么你将不得不自己滚动。也许你可以发布一个github gist,以便其他人可以使用它!

答案 3 :(得分:1)

试试这个:

$params['text'][] = 'Hello World';
$params['text'][] = 'How are you?';
$params['html'][] = '<p>Just fine, thank you</p>';
foreach ($params as $key => $value) {
    foreach ($value as $key2 => $value2) {        
        $http_query.= $key . "[]=" . $value2 . "&";
    }
}
$http_query = substr($http_query, 0, strlen($http_query)-1); // remove the last '&'
$http_query = str_replace(" ", "%20", $http_query); // manually encode spaces
echo $http_query;