Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让PHP正确地对数字索引数组进行URL编码?_Php_Arrays_Http_Curl_Urlencode - Fatal编程技术网

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

如何让PHP正确地对数字索引数组进行URL编码?,php,arrays,http,curl,urlencode,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脚本,其中

我有一个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
//有效,预期的URL编码结果
echo“数据%5B%5D=58和数据%5B%5D=17”;
//用户从PHP.net提交的函数
//这应该是正确的,但不是
函数cr_post($a,$b='',$c=0){
如果(!is_数组($a))返回false;
foreach((数组)$a作为$k=>$v){
如果有的话($c){
如果(是数字($k)){
$k=$b.“[]”;
}否则{
$k=$b.“[$k]”;
}
}否则,如果(是整($k)){
$k=$b.$k;
}
if(is_数组($v)| is_对象($v)){
$r[]=cr_职位($v,$k,1);
继续;
}
$r[]=urlencode($k)。“=”.urlencode($v);
}
返回内爆(&,$r);
}
echo'.cr_post(数组(58,17)).';//输出“0=58和1=17”不正确
//又一次尝试
$data=阵列(58,17);
$query=http\u build\u query($data);
$query=preg_replace('/%5B[0-9]+%5D/simU','%5B%5D',$query);
回显“.$query.”;//输出“0=58和1=17”不正确

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

第二次尝试时,你差一点:


您可以使用preg_replace删除这些数字索引,但如果它先改变了什么,我会尝试一下。

谢谢您为我指明了正确的方向。将$data包装到另一个数组中会正确编码数组名称,但不会将数字索引放在括号中。所以我在我的原始帖子中使用了preg_replace或cr_post函数来正确编码输出。
$data = array(58,17);
//equivalent to $string = 'data%5B0%5D=58&data%5B1%5D=17';
$string = http_build_query(array('data' => $data));