You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:27:43