如何使用 PHP cURL 发送没有嵌套数组中的数组键的多维数组?

How to send a multidimensional array with PHP cURL without array keys from the nested arrays?

简介

所以我试图将表单值作为查询字符串发送到 API。 API 需要这样的查询字符串:

&name=Charles+Hansen&email=example@email.com&locations=23433&locations=23231&propertyTypes=APARTMENT&propertyTypes=TOWNHOUSE&message=test"

如您所见,有多个 "propertyTypes" 和 "locations",具体取决于用户在表单中选择的 属性 类型或位置。因此,我将所有 $_POST 数据存储在一个看起来像这样的多维数组中,因为我显然不能有多个具有相同名称 "propertyTypes" 或 "locations":

的键
Array
(
    [name] => Charles Hansen
    [email] => example@email.com
    [locations] => Array
        (
            [0] => 23433
            [1] => 23231
        )
    [propertyTypes] => Array
        (
            [0] => APARTMENT
            [1] => TOWNHOUSE
        )
    [message] => test
)

cURL 不支持多维数组,因此我先自己构建查询再使用它。这是我的 cURL 函数:

function sg_order($post_fields) {
    if($post_fields) {
        $query = http_build_query($post_fields);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'https://example.com/order?orgKey=' . constant('ORG_KEY'));
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/x-www-form-urlencoded',                 
          'Content-Length: ' . strlen($query))
        );
        $result = curl_exec($ch);

        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if(curl_errno($ch)) {
          error_log('Curl error: ' . curl_error($ch) . $result);
        }else{
          error_log('Curl response: ' . $status);
        }
        curl_close($ch);

        return $result;
    }
}

orgKey 是验证所需的参数。

问题

我的问题是,$query = http_build_query($post_fields); 构建的查询包含嵌套数组([0]、[1] 等)的键。 $query 的结果如下所示:

&name=Charles+Hansen&email=example@email.com&locations[0]=23433&locations[1]=23231&propertyTypes[0]=APARTMENT&propertyTypes[1]=TOWNHOUSE&message=test"

如何删除键([0]、[1] 等)以使查询看起来与 API 所期望的完全一致?

附加信息

如果你不想写自己的版本http_build_query,那么我建议你根据手册中的这个用户评论修改版本,http://php.net/manual/en/function.http-build-query.php#111819

    $query = http_build_query($query);
    $query = preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', $query);

他们在这里将 foo[xy] 替换为 foo[] - 因为您也不想保留 [],只需替换 [=21= 中的 '%5B%5D' ] 改为使用空字符串调用。