讲师中心 微信公众号
AI工具推荐 视频效率加速

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

陌萱小哥_6067

陌萱小哥_6067

发布时间:2025-11-16 12:52:47

|

914人浏览过

|

来源于php中文网

原创

处理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内容

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

Feishu calendar sync, local ics to json data for AI agent
Feishu calendar sync, local ics to json data for AI agent

将ICS日历文件转为JSON格式,用于飞书日历导入导出及数据集成。

下载
  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速学教程(入门到精通)
PHP速学教程(入门到精通)

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

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2055

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3002

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1016

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3399

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2711

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

534

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

462

2026.02.12

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

C++运算符基础入门
C++运算符基础入门

本专题详细讲解了C++运算符的类型、语法与使用方法,涵盖算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符及其他特殊运算符,并通过代码示例解析优先级与结合性。

0

2026.10.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn