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()
和更换你的用途@filepath
由CURLFile对象.不幸的是,只有在使用PHP 5.5或更高版本时才可以这样做.手册的页面有一个非常清晰简单的使用示例.
如果使用CURLFiles不是一个选择,那么第二个办法是json_encode()
你的价值观$postfields
这是数组本身阵列.这不优雅,它要求您在另一侧解码JSON.
如果要发送多维数组,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)