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

One*_*ema 11 php arrays function

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

text[]=Hello%20World&text[]=How%20are%20you?&html[]=<p>Just%20fine,%20thank%20you</p>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,此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);
Run Code Online (Sandbox Code Playgroud)

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

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

不幸的是,我正在使用的API不喜欢数字索引而失败.

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

谢谢

Ria*_*iaD 11

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

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

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

  • 想法在这里,但这是正确的实现(参见php在线手册的评论):preg_replace('/%5B [0-9] +%5D/simU','%5B%5D',$ http_query); (6认同)
  • 简单的答案是最好的答案. (4认同)

mic*_*xor 5

我非常同意RiaD的回答,但是您可能会在这段代码中遇到一些问题(对不起,由于缺少代表,我不能仅对此发表评论)。

首先,据我所知,http_build_query返回一个urlencode()字符串,这意味着您将没有[和],但您将拥有%5B和%5D。

其次,PHP的PCRE引擎将'['字符识别为字符类的开始,而不仅仅是简单的'['(PCRE元字符)。最终可能会将您请求中的所有数字都替换为“ []”。

您更有可能想要这样的东西:

preg_replace('/\%5B\d+\%5D/', '%5B%5D', http_build_query($params));
Run Code Online (Sandbox Code Playgroud)

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

preg_replace('/\[\d+\]/', '[]', $http_query);
Run Code Online (Sandbox Code Playgroud)


Exp*_*lls 4

似乎没有办法做到这一点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;
Run Code Online (Sandbox Code Playgroud)

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