PHP从XML响应树中获取总和值

时间:2014-02-25 23:25:45

标签: php xml xml-parsing simplexml response

我试图从特定的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将非常棒。谢谢!

2 个答案:

答案 0 :(得分:2)

使用<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 - 表达式选择所有指定的节点并将其作为数组存储在$leads
  • 它是simplexml elements的数组,因此我们使用array_map()将这些对象转换为整数值
  • 并使用array_sum() - 它的名字暗示着它;-)

看到它有效:https://eval.in/105695

我已经在xpath - 表达式中看到了总和,这将再次缩短代码。但是,我无法让它工作。

答案 1 :(得分: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