从XML API调用中提取结果

时间:2013-06-14 00:25:08

标签: php xml arrays

我搜索过了。我保证我有。但是,我无法从此API调用获得所需的输出。我在这里使用示例:http://docs.whmcs.com/API:XML_Sample_Code

 $url = "http://www.yourdomain.com/includes/api.php"; # URL to WHMCS API file goes here
 $username = "Admin"; # Admin username goes here
 $password = "demoxyz"; # Admin password goes here

 $postfields = array();
 $postfields["username"] = $username;
 $postfields["password"] = md5($password);
 $postfields["action"] = "getclients";
 $postfields["responsetype"] = "xml";

 $query_string = "";
 foreach ($postfields AS $k=>$v) $query_string .= "$k=".urlencode($v)."&";

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_TIMEOUT, 30);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
 $xml = curl_exec($ch);
 if (curl_error($ch) || !$xml) $xml = '<whmcsapi><result>error</result>'.
 '<message>Connection Error</message><curlerror>'.
 curl_errno($ch).' - '.curl_error($ch).'</curlerror></whmcsapi>';
 curl_close($ch);

 $arr = whmcsapi_xml_parser($xml); # Parse XML

 print_r($arr); # Output XML Response as Array

 /*
 Debug Output - Uncomment if needed to troubleshoot problems
 echo "<textarea rows=50 cols=100>Request: ".print_r($postfields,true);
 echo "\nResponse: ".htmlentities($xml)."\n\nArray: ".print_r($arr,true);
 echo "</textarea>";
 */

 function whmcsapi_xml_parser($rawxml) {
    $xml_parser = xml_parser_create();
    xml_parse_into_struct($xml_parser, $rawxml, $vals, $index);
    xml_parser_free($xml_parser);
    $params = array();
    $level = array();
    $alreadyused = array();
    $x=0;
    foreach ($vals as $xml_elem) {
      if ($xml_elem['type'] == 'open') {
         if (in_array($xml_elem['tag'],$alreadyused)) {
            $x++;
            $xml_elem['tag'] = $xml_elem['tag'].$x;
         }
         $level[$xml_elem['level']] = $xml_elem['tag'];
         $alreadyused[] = $xml_elem['tag'];
      }
      if ($xml_elem['type'] == 'complete') {
       $start_level = 1;
       $php_stmt = '$params';
       while($start_level < $xml_elem['level']) {
         $php_stmt .= '[$level['.$start_level.']]';
         $start_level++;
       }
       $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
       @eval($php_stmt);
      }
    }
    return($params);
 }

结果如下:

Array ( 
   [WHMCSAPI] => Array ( 
      [ACTION] => getsupportdepartments 
      [RESULT] => success 
      [TOTALRESULTS] => 2 
      [DEPARTMENTS] => Array ( 
         [DEPARTMENT] => Array (
             [ID] => 2 
             [NAME] => Sales 
             [AWAITINGREPLY] => 5 
             [OPENTICKETS] => 5 
         ) 
         [DEPARTMENT1] => Array ( 
             [ID] => 1 
             [NAME] => Support 
             [AWAITINGREPLY] => 15 
             [OPENTICKETS] => 15 
         ) 
      ) 
   ) 
)

我正在尝试简单地命名部门,然后等待与每个部门名称相关的等待计数。

有什么见解?

1 个答案:

答案 0 :(得分:2)

你可以做这样的事情

foreach($apiResult['WHMCSAPI']['DEPARTMENTS'] as $department) {
  echo $department['NAME'].' has '.$department['AWAITINGREPLY'].' cases awaiting reply.'<br />';
}

请在此处查看完整的演示代码: http://phpfiddle.org/main/code/0c4-pgs


更新了答案:“关于如何通过AWAITING回复值输出的任何想法?即:如果销售有10张票,而支持有12显示支持高于销售,反之亦然? - cbcp”

在这里,您可以使用get变量来定义排序。 url.domain / mypage.php?sort = desc | url.domain / mypage.php?排序= ASC

try {

  $apiResult =  array('WHMCSAPI' => array(
    'ACTION' => 'getsupportdepartments',
    'RESULT' => 'success',
    'TOTALRESULTS' => 2,
    'DEPARTMENTS' => array(
      'DEPARTMENT' => array(
        'ID' => 2,
        'NAME' => 'Sales',
        'AWAITINGREPLY' => 5,
        'OPENTICKETS' => 5
      ),
      'DEPARTMENT1' => array(
        'ID' => 1,
        'NAME' => 'Support',
        'AWAITINGREPLY' => 15,
        'OPENTICKETS' => 15
      )
    )
  )
  );
  echo '<pre>';
  print_r($apiResult);
  echo '</pre>';

  if($apiResult['WHMCSAPI']['RESULT'] != 'success') {
    throw new Exception('Something went wrong while fetching the data.');
  }

  if(!isset($apiResult['WHMCSAPI']['DEPARTMENTS'])) {
    throw new Exception('No departments in API response.');
  }

  if(!empty($_GET['sort'])) {
    $tmpArray = array();
    foreach($apiResult['WHMCSAPI']['DEPARTMENTS'] as $key => $value) {
      $tmpArray[$value['AWAITINGREPLY']] = $value;
    }
    $apiResult['WHMCSAPI']['DEPARTMENTS'] = $tmpArray;

    ($_GET['sort'] == 'desc') ? krsort($apiResult['WHMCSAPI']['DEPARTMENTS']) : ksort($apiResult['WHMCSAPI']['DEPARTMENTS']);
  }

  foreach($apiResult['WHMCSAPI']['DEPARTMENTS'] as $department) {
    echo $department['NAME'].' has '.$department['AWAITINGREPLY'].' cases awaiting reply.<br />';
  }
} catch (Exception $exc) {
  echo $exc;
}

如果您更喜欢默认排序,那么您应该根据自己的需要进行修改。

if(!empty($_GET['sort'])) {
  $tmpArray = array();
  foreach($apiResult['WHMCSAPI']['DEPARTMENTS'] as $key => $value) {
    $tmpArray[$value['AWAITINGREPLY']] = $value;
  }
  $apiResult['WHMCSAPI']['DEPARTMENTS'] = $tmpArray;

  ($_GET['sort'] == 'desc') ? krsort($apiResult['WHMCSAPI']['DEPARTMENTS']) : ksort($apiResult['WHMCSAPI']['DEPARTMENTS']);
}

---&GT;

$tmpArray = array();
foreach($apiResult['WHMCSAPI']['DEPARTMENTS'] as $key => $value) {
  $tmpArray[$value['AWAITINGREPLY']] = $value;
}
$apiResult['WHMCSAPI']['DEPARTMENTS'] = $tmpArray;

krsort($apiResult['WHMCSAPI']['DEPARTMENTS']);

这将按照您的要求对部门进行排序。