如何让PHP正确地对数字索引数组进行URL编码?

时间:2014-07-05 21:00:07

标签: php arrays http curl urlencode

我有一个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

有更好或更简单的方法吗?我的方法出了什么问题?

1 个答案:

答案 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剥离这些数字索引,但如果先更改任何内容,我会尝试。