用PHP导入外部XML文件,对值求和

时间:2018-07-24 21:12:48

标签: php xml

就像标题中所说的那样,我正在将外部XML文件导入站点。实际上是来自世界各地观测站的天气数据。我可以解析并显示数据没问题。我的问题是我要总结一组特定的数据。

这是基本代码:

<?php
$xml = simplexml_load_file('https://aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&stationString=kbwi&hoursBeforeNow=65');

for($i=0;$i<=60;$i++)
{
$precip[$i] = $xml->data->METAR[$i]->precip_in;
echo $precip[$i];
}    
?>

这将在XML文件中回显“ precip_in”中的所有值,并且可以正常工作。但是,如果我尝试使用array_sum汇总$ precip或'precip_in'中的数据,则会得到一个空白页。使用var_dump会多次返回“ NULL”。

现在,我可以通过执行以下操作来手动求和:

$rainTotal = $precip[0]+$precip[1]+$precip[2];

但是我要做的一件事是总共24小时降雨。观测值并非总是定期或每小时更新一次;意味着如果我要做这样的事情:

$rainTotal = $precip[0]+$precip[1]+$precip[2]...+$precip[23];

这不一定会给我带来24小时的降雨。因此,我需要一种对“ precip_in”或$ precip中包含的所有降雨量值求和的方法。

关于我应该如何进行的任何想法?

编辑:基于以下评论的一些澄清:

回显和var_dump-ing $ precip [$ i]工作正常。但是,如果我尝试以下操作:

<?php
 $xml = simplexml_load_file('https://aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&stationString=kbwi&hoursBeforeNow=65');

for($i=0;$i<=60;$i++)
{
$precip[$i] = $xml->data->METAR[$i]->precip_in;
echo array_sum($precip[$i]);
}    
?>

我得到一个空白页。进行array_sum($ precip [$ i])的var_dump会导致连续多次出现“ NULL”。

我尝试将XML字符串强制转换为浮点数或字符串,但得到的结果相同。

2 个答案:

答案 0 :(得分:0)

$ xml-> data-> METAR [$ i]-> precip_in的值是一个对象((SimpleXMLElement)#12(1){[0] => string(5)“ 0.005”})。它不是数字,所以没有数字值。您可以将其强制转换为浮点数,然后获取所需的数值。

for($i=0;$i<=60;$i++)
{
  $precip[$i] = (float)$xml->data->METAR[$i]->precip_in;
  echo $precip[$i];
}  

这些浮点值可以求和。

答案 1 :(得分:0)

考虑在XPath数组返回上使用array_sum

$xml = simplexml_load_file('https://aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&stationString=kbwi&hoursBeforeNow=65');

$result = array_sum(array_map("floatval", $xml->xpath('//METAR/precip_in')));

echo $result;
// 10.065

或者,您可以使用XPath的sum(),它需要使用DOMDocument而不是SimpleXML,特别是DOMXPath::evaluate

$dom = new DOMDocument;
$dom->load('https://aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&stationString=kbwi&hoursBeforeNow=65');

$xpath = new DOMXPath($dom);
$sum = (float)$xpath->evaluate('sum(//METAR/precip_in)');

echo $sum;
// 10.065