使用CURLOPT_POSTFIELDS时进行数组2字符串转换

Grz*_*orz 3 php arrays curl libcurl notice

我有以下代码:

// $postfields = array();
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
Run Code Online (Sandbox Code Playgroud)

我的$postfields变量是一个参数数组.我有一个通知,有数组到字符串转换.它起作用.

我可以使用http_build_query()函数来取消通知,但我@path_to_file用来包含帖子文件.和http_build_query()打破文件包括.

我想知道是否有更多"正确"的方法来做到这一点.没有产生通知.

小智 7

$postfields数组的某些值本身是什么?这很可能是导致通知的原因.curl_setops期望它的第三个参数是一个数组,其键和值是字符串,如PHP函数的手册页中所述,尽管它可能不是很清楚:

此参数可以作为urlencoded字符串传递,如'para1 = val1¶2 = val2&...',也可以作为数组传递,字段名称为键,字段数据为值.

在这个引用中,关键点是para1/2和val1/2是字符串,如果需要,你可以将它们作为一个数组提供,其中键是para1和para2,值是val1和val2.

两种方法可以消除通知.

第一个是使用http_build_query()和更换你的用途@filepathCURLFile对象.不幸的是,只有在使用PHP 5.5或更高版本时才可以这样做.手册的页面有一个非常清晰简单的使用示例.

如果使用CURLFiles不是一个选择,那么第二个办法是json_encode()你的价值观$postfields这是数组本身阵列.这不优雅,它要求您在另一侧解码JSON.

  • 使用 `http_build_query` 和 `CURLFiles` 不起作用。`CURLFiles` 将被转换为数组,并且只是作为常规的 `$_POST` 数据出现。 (2认同)

Yis*_*Dov 7

如果要发送多维数组,j11e的答案将不起作用

试试这个递归函数.

https://gist.github.com/yisraeldov/ec29d520062575c204be7ab71d3ecd2f

<?php
function build_post_fields( $data,$existingKeys='',&$returnArray=[]){
    if(($data instanceof CURLFile) or !(is_array($data) or is_object($data))){
        $returnArray[$existingKeys]=$data;
        return $returnArray;
    }
    else{
        foreach ($data as $key => $item) {
            build_post_fields($item,$existingKeys?$existingKeys."[$key]":$key,$returnArray);
        }
        return $returnArray;
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它.

curl_setopt($ch, CURLOPT_POSTFIELDS, build_post_fields($postfields));
Run Code Online (Sandbox Code Playgroud)