我有一个PHP服务,可以从客户端获取POST数据,如下所示:
if($_POST['data']) {
$uid = $_POST['data'][0];
$cid = $_POST['data'][1];
// ...
}
客户端发送URL编码的POST数据,如下所示:
'data%5B%5D=58&data%5B%5D=17'
客户端Javascript传递数组以形成上述字符串:
var data = [58,17];
现在我正在编写另一个PHP脚本,我希望使用cURL从PHP中调用以前的服务。但是,以下尝试对此简单数组进行正确的URL编码并不会创建我知道客户端发送的格式:
// Valid, expected URL encoded result
echo "<pre>data%5B%5D=58&data%5B%5D=17</pre>";
// User-submitted function from PHP.net
// that's supposed to do it right, but doesn't
function cr_post($a, $b = '', $c = 0) {
if (!is_array($a)) return false;
foreach ((array)$a as $k=>$v) {
if($c) {
if(is_numeric($k)) {
$k = $b."[]";
} else {
$k = $b."[$k]";
}
} else if (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);
}
echo '<pre>'.cr_post(array(58,17)).'</pre>'; // Outputs '0=58&1=17' incorrectly
// Another attempt
$data = array(58,17);
$query = http_build_query($data);
$query = preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', $query);
echo '<pre>'.$query.'</pre>'; // Outputs '0=58&1=17' incorrectly
有更好或更简单的方法吗?我的方法出了什么问题?
答案 0 :(得分:2)
你接近第二次尝试:
$data = array(58,17);
//equivalent to $string = 'data%5B0%5D=58&data%5B1%5D=17';
$string = http_build_query(array('data' => $data));
您可以使用preg_replace剥离这些数字索引,但如果先更改任何内容,我会尝试。