PHP中高效聚合多JSON文件数据并生成报表

心靈之曲
发布: 2025-11-17 13:22:50
原创
458人浏览过

php中高效聚合多json文件数据并生成报表

本教程详细介绍了如何使用PHP处理多个结构相似的JSON文件,并根据特定键(如周数)聚合其中的数值数据。通过文件遍历、JSON解析、关联数组构建及空值合并运算符,我们将逐步演示如何高效地汇总数据,为生成报表提供结构化的结果。

在现代Web开发中,处理和分析来自多个数据源的JSON数据是一项常见任务。本教程将指导您如何使用PHP读取分散在多个JSON文件中的数据,并根据特定字段(例如周数)进行聚合汇总,最终形成一个便于展示或进一步处理的结构化数据集。

1. 理解JSON数据结构

假设我们有一系列JSON文件,每个文件代表一个独立的数据记录,其结构如下:

{
    "id": "id_1638974137049",
    "weeknr": 48,
    "dayhours": 5,
    "tvt": 1.25
}
登录后复制

这些文件可能位于同一个目录下。我们的目标是汇总所有文件中,相同weeknr(周数)对应的dayhours(日工时)和tvt(电视观看时间)的总和。

立即学习PHP免费学习笔记(深入)”;

2. 加载与解析JSON文件

首先,我们需要定位所有JSON文件,然后逐一读取其内容并解析为PHP可操作的数据结构。

<?php

// 定义JSON文件所在的目录
$dataDirectory = 'data/*.json'; 

// 使用glob函数查找匹配指定模式的所有文件路径
// 结果是一个包含所有文件路径的数组
$files = glob($dataDirectory);

// 初始化一个空数组,用于存储所有解析后的JSON对象
$allJsonObjects = [];

// 遍历每个找到的文件
foreach ($files as $file) {
    // 读取文件内容
    $jsonContent = file_get_contents($file);

    // 将JSON字符串解码为PHP关联数组
    // 第二个参数设置为 true 表示解码为关联数组,而不是标准对象
    $decodedData = json_decode($jsonContent, true);

    // 检查解码是否成功,避免处理无效JSON
    if (json_last_error() === JSON_ERROR_NONE && is_array($decodedData)) {
        $allJsonObjects[] = $decodedData;
    } else {
        // 可以根据需要添加错误处理逻辑,例如记录日志
        error_log("Error decoding JSON from file: " . $file . " - " . json_last_error_msg());
    }
}

// 此时,$allJsonObjects 数组中包含了所有JSON文件解析后的PHP关联数组
// 例如:
// [
//     ['id' => 'id_...', 'weeknr' => 48, 'dayhours' => 5, 'tvt' => 1.25],
//     ['id' => 'id_...', 'weeknr' => 48, 'dayhours' => 6, 'tvt' => 1.50],
//     ...
// ]

?>
登录后复制

注意事项:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online
  • glob('data/*.json') 会返回 data 目录下所有 .json 文件的路径。请确保您的JSON文件位于正确的目录中。
  • file_get_contents() 用于高效读取整个文件内容。
  • json_decode($jsonContent, true) 是关键,它将JSON字符串转换为PHP关联数组。如果省略 true,则会转换为标准PHP对象。
  • 添加 json_last_error() 检查可以帮助您捕获和处理无效的JSON文件,提高代码的健壮性。

3. 数据聚合逻辑

在获取了所有解析后的数据后,下一步是根据 weeknr 字段进行聚合。我们将创建一个新的数组,以 weeknr 作为其主键,并在其中累加 dayhours 和 tvt。

<?php
// 假设 $allJsonObjects 已经如上一步所示填充完毕

// 初始化一个空数组,用于存储按周聚合后的数据
// 结构将是:[weeknr => ['dayhours' => total_dayhours, 'tvt' => total_tvt]]
$weeksData = [];

// 遍历所有解析后的JSON对象
foreach ($allJsonObjects as $dataEntry) {
    // 获取当前记录的周数
    $weeknr = $dataEntry['weeknr'];

    // 确保当前周的数据结构已存在,如果不存在则初始化为0
    // 使用 null 合并运算符 (??) 是一个简洁的写法,
    // 如果 $weeksData[$weeknr]['dayhours'] 不存在或为 null,则取 0
    $weeksData[$weeknr]['dayhours'] = ($weeksData[$weeknr]['dayhours'] ?? 0) + $dataEntry['dayhours'];
    $weeksData[$weeknr]['tvt'] = ($weeksData[$weeknr]['tvt'] ?? 0) + $dataEntry['tvt'];
}

// 此时,$weeksData 数组将包含按周聚合后的数据,例如:
// [
//     48 => ['dayhours' => 18, 'tvt' => 4.5],
//     49 => ['dayhours' => 20, 'tvt' => 6.5],
//     50 => ['dayhours' => 24, 'tvt' => 5.5],
//     ...
// ]

?>
登录后复制

关键点:空值合并运算符 (??)($weeksData[$weeknr]['dayhours'] ?? 0) 是PHP 7引入的空值合并运算符。它的作用是:如果左侧的表达式存在且不为 null,则使用左侧的值;否则,使用右侧的值(在这里是 0)。这避免了在第一次遇到某个 weeknr 时出现“未定义索引”的错误,并确保了累加操作的正确性。

4. 完整代码示例

将上述步骤整合在一起,以下是完整的PHP代码,用于从多个JSON文件聚合数据:

<?php

// 1. 定义JSON文件所在的目录模式
$dataDirectoryPattern = 'data/*.json'; 

// 2. 查找所有匹配的文件
$files = glob($dataDirectoryPattern);

// 3. 初始化数组用于存储所有解码后的JSON对象
$allJsonObjects = [];

// 4. 遍历文件,读取并解码JSON
foreach ($files as $file) {
    $jsonContent = file_get_contents($file);
    $decodedData = json_decode($jsonContent, true);

    if (json_last_error() === JSON_ERROR_NONE && is_array($decodedData)) {
        $allJsonObjects[] = $decodedData;
    } else {
        error_log("Error decoding JSON from file: " . $file . " - " . json_last_error_msg());
    }
}

// 5. 初始化数组用于存储按周聚合后的数据
$weeksData = [];

// 6. 遍历所有解码后的数据,进行聚合
foreach ($allJsonObjects as $dataEntry) {
    $weeknr = $dataEntry['weeknr'];

    // 累加 dayhours 和 tvt,使用 ?? 运算符处理首次出现的周数
    $weeksData[$weeknr]['dayhours'] = ($weeksData[$weeknr]['dayhours'] ?? 0) + $dataEntry['dayhours'];
    $weeksData[$weeknr]['tvt'] = ($weeksData[$weeknr]['tvt'] ?? 0) + $dataEntry['tvt'];
}

// 7. 打印聚合后的数据(可选,用于调试或验证)
echo "<pre>";
print_r($weeksData);
echo "</pre>";

// 预期输出类似:
// Array
// (
//     [48] => Array
//         (
//             [dayhours] => 18
//             [tvt] => 4.5
//         )
//     [49] => Array
//         (
//             [dayhours] => 20
//             [tvt] => 6.5
//         )
//     [50] => Array
//         (
//             [dayhours] => 24
//             [tvt] => 5.5
//         )
// )

?>
登录后复制

5. 生成表格输出

一旦数据被聚合到 $weeksData 数组中,您可以很容易地将其渲染成HTML表格。

<?php
// 假设 $weeksData 已经包含聚合后的数据

echo "<table border='1'>";
echo "<thead>";
echo "<tr><th>周数 (weeknr)</th><th>总日工时 (tot dayhours)</th><th>总电视观看时间 (tot tvt hours)</th></tr>";
echo "</thead>";
echo "<tbody>";

// 遍历聚合后的数据,每一项代表一周的汇总
foreach ($weeksData as $weeknr => $totals) {
    echo "<tr>";
    echo "<td>" . htmlspecialchars($weeknr) . "</td>";
    echo "<td>" . htmlspecialchars($totals['dayhours']) . "</td>";
    echo "<td>" . htmlspecialchars($totals['tvt']) . "</td>";
    echo "</tr>";
}

echo "</tbody>";
echo "</table>";

?>
登录后复制

注意事项:

  • 使用 htmlspecialchars() 可以防止跨站脚本 (XSS) 攻击,尤其是在将用户或外部数据输出到HTML时。
  • 您可以根据需要对表格进行样式化(CSS)。

总结

本教程展示了如何利用PHP高效地处理多个JSON文件,并根据共同的键值聚合数据。通过 glob 函数查找文件、file_get_contents 读取内容、json_decode 解析数据,以及巧妙运用关联数组和空值合并运算符进行数据累加,我们能够将分散的数据转化为结构化的汇总信息,为后续的数据分析或报表生成奠定了基础。这种方法不仅适用于JSON文件,其核心逻辑也可应用于处理其他格式的结构化数据。

以上就是PHP中高效聚合多JSON文件数据并生成报表的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号