计算PHP中一系列XML元素的平均值
我试图计算PHP中一系列XML元素的平均值,但还没有找到任何解决方案 下面是XML元素计算PHP中一系列XML元素的平均值,php,arrays,xml,range,moving-average,Php,Arrays,Xml,Range,Moving Average,我试图计算PHP中一系列XML元素的平均值,但还没有找到任何解决方案 下面是XML元素 <root> <quoteDay> <date>2018-02-26</date> <close>1586,96</close> </quoteDay> <quoteDay> <date>2018-02-23</date>
<root>
<quoteDay>
<date>2018-02-26</date>
<close>1586,96</close>
</quoteDay>
<quoteDay>
<date>2018-02-23</date>
<close>1577,11</close>
</quoteDay>
<quoteDay>
<date>2018-02-22</date>
<close>1565,5</close>
</quoteDay>
</root>
2018-02-26
1586,96
2018-02-23
1577,11
2018-02-22
1565,5
以下是PHP代码:
<?php
$xml = simplexml_load_file("file.xml") or die("Error: Cannot create object");
$id = -1;
$total[] = 0;
foreach ($xml->root as $root) {
foreach ($root->quoteDay as $quoteDay) {
$id ++;
$total[] += $root->quoteDay[$id]->close;
$close = number_format(round($quoteDay->close,0));
echo $quoteDay->date; echo $close; echo $total[$id+1];
}
}
?>
root作为$root){
foreach($root->quoteDay作为$quoteDay){
$id++;
$total[]+=$root->quoteDay[$id]->关闭;
$close=number_格式(四舍五入($quoteDay->close,0));
echo$quoteDay->date;echo$close;echo$total[$id+1];
}
}
?>
因此,对于每个报价日,我想返回日期、收盘价和移动平均线
日期2018-02-26将返回2018-02-26和2018-02-23的“关闭”平均值=(1586,96+1577,11)/2
2018-02-23的平均值将返回(1577,11+1565,5)/2
正如你们所看到的,我试图为每个元素求一个累积的总和,但由于某些原因,我不明白这是行不通的
如何计算元素的移动平均数?为了获得结果,您需要做以下几件事:
已经为您提供了根目录,因此不需要第一个循环simplexml\u load\u file()
数组不是必需的$total
- 您的XML有
作为小数分隔符,但PHP使用,
,因此您需要替换它们,以便进行数学运算,而不丢失小数(这里我将其转换为
,这会使您失去精度,请仔细研究以避免这种情况)float
- 我假设第一天,当没有之前的值时,移动平均值就是当天的值
<?php
$xml = simplexml_load_file("a.xml") or die("Error: Cannot create object");
$id = 0;
foreach ($xml->quoteDay as $quoteDay) {
echo "Moving average for ".$quoteDay->date.":".PHP_EOL;
$current = (float) str_replace(",", ".", $quoteDay->close);
$previous = $xml->quoteDay[$id + 1]
? (float) str_replace(",", ".", $xml->quoteDay[$id + 1]->close)
: $current;
$movingMean = ($current + $previous) / 2;
echo $movingMean.PHP_EOL;
echo PHP_EOL;
$id++;
}
请注意,在本例中,如果将$daysinsimovingmean=2代码>
2018-02-22
的含义是什么<代码>1565,5+?/2?我有比我发布的更多的元素,但这是一个公平的输入,因为最后一个元素不会返回任何平均值。我必须放一个if语句来检查是否有前面的元素@谢谢你!如果$previous变量可以附加一系列元素,您也能回答吗?比如$previous=$xml->quoteDay[range($id,$id+2)]。
$xml = simplexml_load_file("a.xml") or die("Error: Cannot create object");
$id = 0;
$daysInMovingMean = 3;
foreach ($xml->quoteDay as $quoteDay) {
echo "Moving average for ".$quoteDay->date.":".PHP_EOL;
$sum = 0;
for ($days = 0; $days < $daysInMovingMean; $days++) {
if (!$xml->quoteDay[$id + $days]) break;
$sum += (float) str_replace(",", ".", $xml->quoteDay[$id + $days]->close);
}
$sumovingMean = $sum / $days;
echo $sumovingMean.PHP_EOL;
echo PHP_EOL;
$id++;
}