计算PHP中一系列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>

我试图计算PHP中一系列XML元素的平均值,但还没有找到任何解决方案

下面是XML元素

<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++;
}