2012-08-03 54 views
1

我需要從cURL請求輸出具有特定格式的數組。我嘗試了很多方法來根據需要格式化XML結果,但沒有運氣。從cURL XML響應自定義數組

這裏是PHP代碼

<?php 
$request_url = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=71939360&sCepDestino=72151613&nVlPeso=1&nCdFormato=1&nVlComprimento=16&nVlAltura=5&nVlLargura=15&sCdMaoPropria=s&nVlValorDeclarado=200&sCdAvisoRecebimento=n&nCdServico=41106%2C40045&nVlDiametro=0&StrRetorno=xml 4110616,9034,000,001,50SN04004519,2014,000,002,00SS0"; 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $request_url); 
curl_setopt($curl, CURLOPT_TIMEOUT, 130); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

$response = curl_exec($curl); 
      curl_close($curl);  

print_r($response); 
?> 

它打印出以下XML

<servicos> 
    <cservico> 
     <codigo>41106</codigo> 
     <valor>16,90</valor> 
     <prazoentrega>3</prazoentrega> 
     ... 
     <erro>0</erro> 
     <msgerro> 
     </msgerro> 
    </cservico> 
    <cservico> 
     <codigo>40045</codigo> 
     <valor>19,20</valor> 
     <prazoentrega>1</prazoentrega> 
     ... 
     <erro>0</erro> 
     <msgerro> 
     </msgerro> 
    </cservico> 
</servicos> 

或下面的數組,如果我申請$xml = new SimpleXMLElement($response);

SimpleXMLElement Object 
(
    [cServico] => Array 
     (
      [0] => SimpleXMLElement Object 
       (
        [Codigo] => 41106 
        [Valor] => 16,90 
        [PrazoEntrega] => 3 
        ... 
        [Erro] => 0 
        [MsgErro] => SimpleXMLElement Object 
         (
         ) 
       ) 
      [1] => SimpleXMLElement Object 
       (
        [Codigo] => 40045 
        [Valor] => 19,20 
        [PrazoEntrega] => 1 
        ... 
        [Erro] => 0 
        [MsgErro] => SimpleXMLElement Object 
         (
         ) 
       ) 
     ) 
) 

我需要什麼回報和陣列喜歡這個。我嘗試了幾乎所有在其他問題中找到的方法,但從未得到構建這個二維數組的好方法。

array(
    'Option Name' => array(
     'id'=>'40045', 
     'quote'=>'20,20', 
     'days'=>'1', 
    ), 
    'Option Name' => array(
     'id'=>'40215', 
     'quote'=>'29,27', 
     'days'=>'3', 
    ) 
) 

*選項名稱將在以後通過ID碼檢索。

回答

-1

我終於得到它。測試您的各種建議和其他許多人對谷歌發現後,我想出了這個:

<?php 
$request_url = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=71939360&sCepDestino=72151613&nVlPeso=1&nCdFormato=1&nVlComprimento=16&nVlAltura=5&nVlLargura=15&sCdMaoPropria=s&nVlValorDeclarado=200&sCdAvisoRecebimento=n&nCdServico=41106%2C40045&nVlDiametro=0&StrRetorno=xml 4110616,9034,000,001,50SN04004519,2014,000,002,00SS0"; 

//Setup cURL Request 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $request_url); 
curl_setopt($curl, CURLOPT_TIMEOUT, 130); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

$response = curl_exec($curl); 
      curl_close($curl); 

$xml = simplexml_load_string($response); 

$services = $xml->cServico; 

$result = array(); 

foreach($services as $service) { 
    $id = $service->Codigo->__toString(); 
    $quote = $service->Valor->__toString(); 
    $delivery_days = $service->PrazoEntrega->__toString(); 

    //Get simplified service name (option_name) 
    switch ($id) { 
     case "40010": 
     case "40096": 
     case "40436": 
     case "40444": 
     case "40568": 
     case "40606": 
      $option_name = 'SEDEX'; break; 
     case "81019": 
     case "81868": 
     case "81833": 
     case "81850": 
      $option_name = 'e-SEDEX'; break; 
     case "41106": 
     case "41068": 
      $option_name = 'PAC'; break; 
     case "40045": 
     case "40126": 
      $option_name = 'SEDEX a Cobrar'; break; 
     case "40215": 
      $option_name = 'SEDEX 10'; break; 
     case "40290": 
      $option_name = 'SEDEX Hoje'; break; 
     case "81027": 
      $option_name = 'e-SEDEX Prioritário'; break; 
     case "81035": 
      $option_name = 'e-SEDEX Express'; break; 
    } 


    $result[$option_name] = array('id' => $id, 'quote' => $quote, 'delivery_days' => $delivery_days); 
} 
?> 

最後的祕密是增加__toString()轉換值返回數組到一個簡單的字符串。它打印完美。感謝你們!!

Array 
(
    [PAC] => Array 
     (
      [id] => 41106 
      [quote] => 16,90 
      [delivery_days] => 3 
     ) 

    [SEDEX a Cobrar] => Array 
     (
      [id] => 40045 
      [quote] => 19,20 
      [delivery_days] => 1 
     ) 

) 
5

這應該完美無缺!

$xml = simplexml_load_string($response); 
$json = json_encode($xml); 
$arr = json_decode($json,true); 

$temp = array(); 
foreach($arr as $k=>$v) { 
    foreach($v as $k1=>$v1) { 
    $temp[$k][$k1] = $v1; 
    } 
} 

echo "<pre>";print_r($temp);echo "</pre>"; 

http://ka.lpe.sh/2012/07/26/php-convert-xml-to-json-to-array-in-an-easy-way/

+0

對不起,我的愚蠢,但它最終打印幾乎相同的陣列,因爲我張貼。也就是說,我仍然不知道如何從那裏得到理想的結果! :/ – 2012-08-03 23:09:27

+0

對我來說,好像我需要在數組的第二維上執行一個foreach循環(以[0],[1]作爲鍵的那個),使它們成爲新的最終數組的鍵,然後訪問來自第三維的數據使它們成爲數組。我只是不知道該怎麼做。 :( – 2012-08-03 23:13:58

+0

等待我會幫你通過 – Kalpesh 2012-08-03 23:16:56

1

試試這個功能(傳遞給它的響應,它應該回到你的陣列):

function getArrayFromResponse($response) { 
    $xml = new SimpleXMLElement($response); 
    $array = array(); 
    foreach($xml->cServico as $node){ 
    $array[] = array(
     'id' => $node->Codigo, 
     'quote' => $node->Valor, 
     'days' => $node->PrazoEntrega 
    ); 
    } 
    return $array; 
} 
+0

沒有用'print_r($ array)'代替'return $ array',它幾乎可以釘住它,但是代替'[id] => 41106'作爲'key => value',它打印出'key =>數組[0] =>值)' – 2012-08-03 23:35:03

+0

我跟着你發佈的東西,它不會發生......反正如果發生了什麼,只需要替換id'=> $ node-> Codigo,'在我的代碼中用'id '=> $ node-> Codigo [0],'應該沒問題 – Oussama 2012-08-03 23:47:07