2012-08-03 52 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