就像标题中所说的那样,我正在将外部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字符串强制转换为浮点数或字符串,但得到的结果相同。
答案 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