2014-02-25 23 views
1

我試着從一個特定的XML樹得到的總和值,像這樣:PHP獲取總和值從XML響應樹

<response> 
    <date_start>2014-02-01</date_start> 
    <date_end>2014-02-25</date_end> 
    <source>Web</source> 
    <partners> 
     <partner> 
      <partner_id>99</partner_id> 
      <number_of_leads>11</number_of_leads> 
     </partner> 
     <partner> 
      <partner_id>101</partner_id> 
      <number_of_leads>17</number_of_leads> 
     </partner> 
     <partner> 
      <partner_id>103</partner_id> 
      <number_of_leads>38</number_of_leads> 
     </partner> 
    </partners> 
</response> 

我想結束:從第三方

示例響應結果是這樣的變量:$ lead_total ='66';重複的「合作伙伴」塊可以有1到100個列出的合作伙伴。所以我想能夠遍歷所有合作伙伴並顯示number_of_leads總和。

到目前爲止,我一直都在做這樣說,這是醜陋的,不是很可擴展的,並且我要創建新的文件,每次我增加額外的對方ID下面的查詢字符串:

$target_url = 'https://........&Partner_ID=99,101,103.....'; 

$xml = simplexml_load_file($target_url); 

$number_of_leads1 = $xml->partners->partner[0]->number_of_leads; 
$number_of_leads2 = $xml->partners->partner[1]->number_of_leads; 
$number_of_leads3 = $xml->partners->partner[2]->number_of_leads; 

if(!$number_of_leads1) { $number_of_leads1 = '0'; } 
if(!$number_of_leads2) { $number_of_leads2 = '0'; } 
if(!$number_of_leads3) { $number_of_leads3 = '0'; } 

$lead_total = $number_of_leads1 + $number_of_leads2 + $number_of_leads3; 

header('Content-type: text/xml'); 
header('Pragma: public'); 
header('Cache-control: max-age=0 no-cache must-revalidate no-store'); 
header('Expires: -1'); 
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; 
echo " 
<root> 
    <item> 
     <value>{$lead_total}</value> 
     <text>{$currenttime} CST, {$currentdate}</text> 
    </item> 
</root> 
"; 

我不是非常擅長創建循環,或數組,或更先進的PHP,所以任何幫助清理這個混亂,非常讚賞。理想情況下,根據url字符串中的Partner_ID獲取總number_of_leads會很棒。謝謝!

回答

0

我認爲你可以在你的XML文件,並和所有number_of_leads循環而循環如下

$xml = simplexml_load_file($target_url); 
$total=0; 
foreach($xml->partners->partner as $data) 
{  
    $total += $data->number_of_leads; 
} 
echo 'Total is: ' . $total; 
//output Total is: 66 

Live Working Demo

注意在演示中,我使用simple_load_xml_string,因爲我把你的XML作爲一個字符串,而是將其作爲文件下載,因此請使用simple_load_xml_file正如您所做的那樣

+0

這很好。比我所做的要簡單得多。 – user1371519

1

全選<number_of_leads>xpath

$xml = simplexml_load_string($x); // assume XML in $x 
$leads = $xml->xpath("/*/partners/partner/number_of_leads"); 

計算的總和與:

$totalleads = array_sum(array_map("intval", $leads)); 

評論:

  • xpath -expression選擇所有指定的節點,並將它們存儲作爲陣列中$leads
  • 它是一個數組simplexml elements,因此我們使用array_map()將這些對象轉換爲整數值
  • 和使用array_sum() - 它做什麼,它的名字一樣;-)

看到它的工作:https://eval.in/105695

我見過的總和內建xpath表達式,這將再次縮短代碼。儘管如此,我還是無法完成工作。