2016-01-25 34 views
0

我已经以下代码:阵列2串转换CURLOPT_POSTFIELDS

// $postfields = array(); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); 

$postfields变量是参数数组。我有一个通知有数组字符串转换。它适用于寿。

我可以使用http_build_query()函数来取消通知,但是我使用@path_to_file来包含帖子文件。和http_build_query()休息文件包括。

我想知道是否有更多“适当”的方式来做到这一点。不产生通知。

回答

4

$postfields数组本身的某些值?这很可能是导致通知的原因。 curl_setops预计其第三个参数是一个数组,它的键和值是字符串,如在PHP's manual page for the function陈述,尽管它可能并不十分清楚:

此参数可以作为像“PARA1 =一个urlencoded的字符串被传递val1 & para2 = val2 & ...'或作为字段名称作为键和字段数据作为值的数组。

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

还有两种方式来消除通知

第一是使用http_build_query()CURLFile objects取代你的@filepath用途。不幸的是,这只有在使用PHP 5.5或更高版本时才有可能。该手册的页面有一个非常清晰和简单的example of use

如果使用CURLFiles不是一个选择,那么第二方式是json_encode()它们阵列本身的$postfields数组的值。这并不优雅,它需要你解码另一边的JSON。如果你想发送多维数组

试试这个递归函数

+0

的确,这个数组的3个值本身就是数组......我不使用它们,所以这些数据可能无法正确导出。 没想到这些可能是内部阵列。使用带有'CURLFiles'的'http_build_query'的 – Grzegorz

+0

不起作用。 'CURLFiles'将被转换为数组,并以普通的'$ _POST'数据的形式出现。 –

2

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; 
    } 
} 

而且你可以使用它像这样。

curl_setopt($ch, CURLOPT_POSTFIELDS, build_post_fields($postfields));