2016-01-25 35 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));