首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >php url查询不带索引的嵌套数组

php url查询不带索引的嵌套数组
EN

Stack Overflow用户
提问于 2012-08-17 06:53:51
回答 4查看 6.3K关注 0票数 12

我正在使用第三方API,它接收几个参数,这些参数必须像这样编码:

代码语言:javascript
运行
复制
text[]=Hello%20World&text[]=How%20are%20you?&html[]=<p>Just%20fine,%20thank%20you</p>

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

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

代码语言:javascript
运行
复制
$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函数/class-method可以帮助我快速构建这样的查询?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-17 07:04:43

似乎没有一种方法可以用http_build_query做到这一点。抱歉的。不过,在文档页面上,有人有这样的信息:

代码语言:javascript
运行
复制
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要点,这样其他人就可以使用它了!

票数 4
EN

Stack Overflow用户

发布于 2012-08-17 07:06:51

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

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

代码语言:javascript
运行
复制
preg_replace('/(%5B)\d+(%5D=)/i', '$1$2', http_build_query($params));
票数 11
EN

Stack Overflow用户

发布于 2012-08-31 06:13:59

我非常同意RiaD的回答,但你可能会在这段代码中遇到一些问题(对不起,由于缺乏代表,我不能只做一个评论)。

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

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

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

代码语言:javascript
运行
复制
preg_replace('/\%5B\d+\%5D/', '%5B%5D', http_build_query($params));

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

代码语言:javascript
运行
复制
preg_replace('/\[\d+\]/', '[]', $http_query);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11996573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档