PHP中计算XML元素区间移动均值的实现问题求助
我懂你现在的需求——就是给每个quoteDay算出当天和前一天close值的移动平均值对吧?其实这个问题拆解开来很简单,咱们一步步来实现:
解决步骤与代码示例
1. 先明确核心逻辑
你需要的是相邻两个交易日close值的算术平均,所以首先得把XML里的日期和close值提取出来,按日期顺序排列后,逐个配对计算就好。另外注意你的close值用的是逗号作为小数点分隔符,计算前得先转换成PHP能识别的浮点数格式。
2. 解析XML并提取数据
假设你的XML结构类似这样(如果实际节点名称不同,直接调整代码里的节点引用即可):
2018-02-26 1586,96 2018-02-23 1577,11 2018-02-22 1565,50
先用PHP的SimpleXML解析数据,把日期和处理后的close值存成数组:
// 加载XML:如果是本地文件用simplexml_load_file('your-file.xml') $xmlContent = '<quotes>...</quotes>'; // 替换成你的实际XML内容 $xml = simplexml_load_string($xmlContent); $quoteData = []; foreach ($xml->quoteDay as $dayNode) { // 处理close值:把逗号换成小数点,转成浮点数 $cleanClose = (float) str_replace(',', '.', (string)$dayNode->close); $quoteData[] = [ 'date' => (string)$dayNode->date, 'close' => $cleanClose ]; }
3. 按日期升序排序
XML里的日期可能是倒序排列的,咱们得把数据从早到晚排好,这样才能准确找到每个日期的前一天数据:
// 用usort按日期升序排序 usort($quoteData, function($a, $b) { return strtotime($a['date']) - strtotime($b['date']); });
4. 计算移动平均值并输出
遍历排序后的数组,每个元素(除了第一个)都和前一个元素的close值计算平均,最后整理成你需要的结果格式:
$finalResults = []; foreach ($quoteData as $index => $day) { $resultItem = [ 'date' => $day['date'], 'close' => $day['close'], 'moving_average' => null ]; // 从第二个元素开始计算平均值 if ($index > 0) { $prevDayClose = $quoteData[$index - 1]['close']; $average = ($day['close'] + $prevDayClose) / 2; // 保留两位小数,和原数据格式对齐 $resultItem['moving_average'] = round($average, 2); } $finalResults[] = $resultItem; } // 打印结果查看(也可以转成JSON或者存入数据库) echo "<pre>"; print_r($finalResults); echo "</pre>";
运行这段代码后,就能得到你想要的结果:
- 2018-02-22的平均值为null(没有更早的数据)
- 2018-02-23的平均值是
(1577.11 + 1565.50)/2 = 1571.31 - 2018-02-26的平均值是
(1586.96 + 1577.11)/2 = 1582.04
额外注意点
- 如果XML里存在日期不连续的情况(比如周末无数据),这段代码会自动取上一个存在的交易日计算平均,符合股票交易的移动平均逻辑
- 如果你的close值格式有混合(部分用点、部分用逗号),可以加个判断统一处理
内容的提问来源于stack exchange,提问作者hogan
相关产品推荐
相关产品推荐

