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)
我非常同意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)
似乎没有办法做到这一点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,以便其他人可以使用它!