处理PHP中JSON文件集合并按键聚合数据的教程

DDD
发布: 2025-11-16 12:52:47
原创
860人浏览过

处理php中json文件集合并按键聚合数据的教程

本教程旨在指导如何在PHP中高效处理一组JSON文件,解析其内容,并根据特定键(如`weeknr`)聚合数值型数据。文章将详细介绍如何使用`glob`函数获取文件列表,`json_decode`将JSON字符串转换为PHP关联数组,并演示一种优雅的数据聚合策略,最终生成按周汇总的日工时和电视时间数据,为后续的表格输出奠定基础。

1. 引言与需求分析

在数据处理场景中,我们经常需要从多个结构相似的文件中提取信息并进行汇总。本教程将以处理一系列JSON文件为例,每个文件包含一周的工作日信息,如周数(weeknr)、每日工时(dayhours)和电视时间(tvt)。我们的目标是读取所有这些文件,然后按周数聚合每日工时和电视时间,最终得到每周末的总工时和总电视时间。

以下是示例JSON文件的结构:

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

2. 读取与解析JSON文件

首先,我们需要定位并读取所有目标JSON文件,然后将它们的JSON内容解析成PHP可操作的数据结构。

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

2.1 获取文件列表

PHP的glob()函数是一个非常实用的工具,可以根据模式匹配查找文件路径。假设所有JSON文件都存放在名为data的子目录中,我们可以这样获取文件列表:

$files = glob('data/*.json'); // 获取 'data/' 目录下所有 .json 文件的路径
登录后复制

$files变量现在是一个包含所有JSON文件路径的数组。

2.2 解析JSON内容

遍历文件列表,对每个文件执行以下操作:

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
  1. 使用file_get_contents()读取文件内容,这会返回一个JSON字符串。
  2. 使用json_decode()将JSON字符串解码为PHP数据。传入true作为第二个参数,可以将JSON对象解码为关联数组,这通常比标准对象更便于操作。
$objs = []; // 用于存储所有解析后的JSON数据
foreach($files as $file) {
    $json_content = file_get_contents($file);
    if ($json_content === false) {
        // 错误处理:文件读取失败
        error_log("Failed to read file: " . $file);
        continue;
    }
    $decoded_data = json_decode($json_content, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        // 错误处理:JSON解码失败
        error_log("JSON decode error for file " . $file . ": " . json_last_error_msg());
        continue;
    }
    $objs[] = $decoded_data; // 将解码后的关联数组添加到 $objs 数组中
}
登录后复制

经过这一步,$objs数组将包含所有JSON文件的内容,每个元素都是一个关联数组,代表一个JSON对象。

3. 数据聚合逻辑

现在我们拥有了所有原始数据,下一步是根据weeknr聚合dayhours和tvt。我们将创建一个新的数组,以weeknr作为主键,存储每个周的总工时和总电视时间。

3.1 初始化聚合数组

在开始聚合之前,最好先初始化一个空数组来存储最终的聚合结果:

$weeksData = []; // 用于存储按周聚合的数据
登录后复制

3.2 遍历并累加数据

遍历$objs数组,对于每个数据项:

  1. 提取当前的weeknr。
  2. 使用weeknr作为键来访问或初始化$weeksData中的对应项。
  3. 累加dayhours和tvt。

这里需要注意的是,当第一次遇到某个weeknr时,$weeksData[$val['weeknr']]['dayhours']可能尚未定义。为了避免PHP警告并确保正确累加,我们可以使用null合并运算符 ??

foreach($objs as $val) {
    $weeknr = $val['weeknr'];

    // 使用 weeknr 作为数组键,并累加 dayhours 和 tvt
    // 如果 $weeksData[$weeknr] 或其子键尚未定义,则将其视为 0
    $weeksData[$weeknr] = [
        'dayhours' => ($weeksData[$weeknr]['dayhours'] ?? 0) + $val['dayhours'],
        'tvt'      => ($weeksData[$weeknr]['tvt'] ?? 0) + $val['tvt']
    ];
}
登录后复制

完整代码示例:

<?php

// 假设 JSON 文件位于 'data/' 目录下,例如:
// data/file1.json
// data/file2.json
// ...

// 1. 获取所有 JSON 文件
$files = glob('data/*.json');

$objs = []; // 存储所有解析后的 JSON 数据
$weeksData = []; // 存储按周聚合的数据

// 2. 遍历文件并解析 JSON
foreach($files as $file) {
    $json_content = file_get_contents($file);
    if ($json_content === false) {
        error_log("错误:无法读取文件 " . $file);
        continue;
    }

    $decoded_data = json_decode($json_content, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        error_log("错误:文件 " . $file . " 的 JSON 解码失败:" . json_last_error_msg());
        continue;
    }

    $objs[] = $decoded_data;
}

// 3. 遍历解析后的数据并进行聚合
foreach($objs as $val) {
    $weeknr = $val['weeknr'];

    // 使用 null 合并运算符 (??) 确保在第一次遇到某个 weeknr 时,初始值为 0
    $weeksData[$weeknr] = [
        'dayhours' => ($weeksData[$weeknr]['dayhours'] ?? 0) + $val['dayhours'],
        'tvt'      => ($weeksData[$weeknr]['tvt'] ?? 0) + $val['tvt']
    ];
}

// 4. (可选) 排序并输出结果
// 如果需要按 weeknr 排序,可以使用 ksort()
ksort($weeksData);

echo "<pre>";
print_r($weeksData);
echo "</pre>";

/*
预期 $weeksData 结构类似:
Array
(
    [48] => Array
        (
            [dayhours] => 18
            [tvt] => 4.5
        )

    [49] => Array
        (
            [dayhours] => 20
            [tvt] => 6.5
        )
    // ... 其他周的数据
)
*/

// 5. 生成 HTML 表格输出 (根据原始需求)
echo "<table border='1'>";
echo "<thead><tr><th>weeknr</th><th>tot dayhours</th><th>tot tvt hours</th></tr></thead>";
echo "<tbody>";
foreach ($weeksData as $weeknr => $data) {
    echo "<tr>";
    echo "<td>" . htmlspecialchars($weeknr) . "</td>";
    echo "<td>" . htmlspecialchars($data['dayhours']) . "</td>";
    echo "<td>" . htmlspecialchars(sprintf("%.2f", $data['tvt'])) . "</td>"; // 格式化 tvt 为两位小数
    echo "</tr>";
}
echo "</tbody>";
echo "</table>";

?>
登录后复制

4. 注意事项与优化

  • 错误处理: 在实际应用中,务必对file_get_contents()和json_decode()的返回值进行检查,处理文件不存在、读取失败或JSON格式错误等情况。
  • 性能考虑: 对于非常大量的JSON文件或每个文件包含大量数据的情况,考虑分批处理或使用更高效的I/O操作。
  • 数据类型: 确保JSON中的数值类型在PHP中被正确处理。json_decode通常能正确转换,但如果需要特定精度,可能需要额外的格式化(如sprintf)。
  • 输出格式: 聚合后的$weeksData数组可以直接用于生成HTML表格、CSV文件或进一步的数据分析。在生成HTML时,使用htmlspecialchars()可以有效防止XSS攻击。

5. 总结

本教程详细阐述了在PHP中处理多个JSON文件并按特定键聚合数据的完整流程。通过glob()函数获取文件列表,file_get_contents()和json_decode()解析文件内容,以及巧妙利用关联数组和null合并运算符进行数据聚合,我们能够高效地将分散的数据汇总成结构化的信息,为后续的数据展示和分析奠定坚实基础。掌握这些技巧对于PHP开发者处理文件系统中的结构化数据至关重要。

以上就是处理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号