使用PHP过滤JSON数据并按月份统计

使用PHP过滤JSON数据并按月份统计

本文详细阐述了如何使用PHP解析JSON数据,并根据特定日期字段(如Start_Date)进行筛选和按月份统计。通过将JSON字符串解码为PHP数组,遍历数据记录,利用strtotime和date函数提取月份信息,最终实现对各月份数据量的精准计数,为数据分析提供基础。

1. 理解JSON数据结构

在处理任何json数据之前,首先需要清晰地理解其结构。本教程所用的json数据示例如下,它包含了一个嵌套的结构,其中关键的数据位于response.data数组中。每个数组元素又包含一个fielddata对象,我们关注的日期字段start_date就在其中。

{    "response": {        "dataInfo": {            "foundCount": 494,            "returnedCount": 4        },        "data": [            {                "fieldData": {                    "Closed_Date": "10/03/2021",                    "Start_Date": "10/03/2021"                },                "portalData": {},                "recordId": "152962",                "modId": "3"            },            {                "fieldData": {                    "Closed_Date": "11/14/2021",                    "Start_Date": "11/06/2021"                },                "portalData": {},                "recordId": "153228",                "modId": "22"            }            // ... 更多数据项        ]    },    "messages": [        {            "code": "0",            "message": "OK"        }    ]}

我们的目标是从response.data数组中的每个fieldData.Start_Date字段提取月份信息,并统计每个月份的数据项数量。

2. 使用PHP解析JSON数据

PHP提供了内置函数json_decode()来将JSON格式的字符串转换为PHP变量。当第二个参数设置为true时,它会将JSON对象转换为PHP关联数组,这使得我们可以通过键名方便地访问数据。

假设我们已经通过某种方式(例如API请求)获取到了JSON字符串并存储在$jsonString变量中。


3. 按月份统计数据

核心逻辑在于遍历$items数组,对每个数据项的Start_Date进行处理,提取月份,并将其计入一个统计数组。

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

我们将使用以下步骤:

初始化一个空数组:用于存储每个月份的计数。遍历数据项:对$items数组中的每个元素执行操作。提取日期并转换为月份:使用strtotime()函数将日期字符串(例如 “10/03/2021″)转换为Unix时间戳。使用date(“m”, $timestamp)函数将Unix时间戳格式化为两位数的月份(例如 “10” 或 “11”)。更新月份计数:检查当前月份是否已存在于统计数组中。如果不存在,则将其初始化为0。将该月份的计数加1。

以下是实现这一逻辑的PHP代码:

<?php// ... (接上文的JSON解码代码)$months = []; // 初始化一个空数组,用于存储月份统计结果foreach ($items as $item) {    // 确保 'fieldData' 和 'Start_Date' 键存在,避免因数据不完整导致错误    if (isset($item["fieldData"]["Start_Date"])) {        $startDate = $item["fieldData"]["Start_Date"];        // 将日期字符串转换为Unix时间戳,然后提取月份        // 注意:strtotime可以智能解析多种日期格式,但最好保持一致性        $timestamp = strtotime($startDate);        // 如果日期解析失败,跳过此项或进行错误处理        if ($timestamp === false) {            error_log("无法解析日期: " . $startDate);            continue;        }        $month = date("m", $timestamp); // 获取两位数的月份,例如 "10", "11"        // 如果该月份在 $months 数组中不存在,则初始化为0        if (!isset($months[$month])) {            $months[$month] = 0;        }        // 增加该月份的计数        $months[$month]++;    }}// 打印最终的月份统计结果echo "

按月份统计结果:

";print_r($months);echo "n
";// 格式化输出,例如 "Month 10: 1"foreach ($months as $monthNum => $count) { echo "Month " . intval($monthNum) . ": " . $count . "n
";}?>

4. 完整示例代码

将上述所有代码片段整合,形成一个完整的可执行脚本:

<?php// 假设这是从API或其他源获取到的JSON字符串$jsonString = '{    "response": {        "dataInfo": {            "foundCount": 494,            "returnedCount": 4        },        "data": [            {                "fieldData": {                    "Closed_Date": "10/03/2021",                    "Start_Date": "10/03/2021"                },                "portalData": {},                "recordId": "152962",                "modId": "3"            },            {                "fieldData": {                    "Closed_Date": "11/14/2021",                    "Start_Date": "11/06/2021"                },                "portalData": {},                "recordId": "153228",                "modId": "22"            },            {                "fieldData": {                    "Closed_Date": "11/07/2021",                    "Start_Date": "11/06/2021"                },                "portalData": {},                "recordId": "153329",                "modId": "7"            },            {                "fieldData": {                    "Closed_Date": "11/08/2021",                    "Start_Date": "11/08/2021"                },                "portalData": {},                "recordId": "153513",                "modId": "3"            }        ]    },    "messages": [        {            "code": "0",            "message": "OK"        }    ]}';// 将JSON字符串解码为PHP关联数组$decodedData = json_decode($jsonString, true);// 检查解码是否成功if (json_last_error() !== JSON_ERROR_NONE) {    echo "JSON解码错误: " . json_last_error_msg();    exit;}// 提取我们感兴趣的数据数组// 确保路径正确,如果 "response" 或 "data" 不存在,则返回空数组$items = $decodedData["response"]["data"] ?? [];$months = []; // 初始化一个空数组,用于存储月份统计结果foreach ($items as $item) {    // 确保 'fieldData' 和 'Start_Date' 键存在,避免因数据不完整导致错误    if (isset($item["fieldData"]["Start_Date"])) {        $startDate = $item["fieldData"]["Start_Date"];        // 将日期字符串转换为Unix时间戳        $timestamp = strtotime($startDate);        // 如果日期解析失败,跳过此项或进行错误处理        if ($timestamp === false) {            error_log("无法解析日期: " . $startDate);            continue;        }        $month = date("m", $timestamp); // 获取两位数的月份,例如 "10", "11"        // 如果该月份在 $months 数组中不存在,则初始化为0        if (!isset($months[$month])) {            $months[$month] = 0;        }        // 增加该月份的计数        $months[$month]++;    }}// 打印最终的月份统计结果echo "

原始统计数组输出:

";print_r($months);echo "

格式化统计结果:

";foreach ($months as $monthNum => $count) { echo "Month " . intval($monthNum) . ": " . $count . "
";}?>

5. 预期输出

运行上述代码,将得到以下输出:

原始统计数组输出:

Array( [10] => 1 [11] => 3)

格式化统计结果:

Month 10: 1Month 11: 3

6. 注意事项

日期格式一致性:strtotime()函数在解析日期字符串时非常灵活,但为了确保代码的健壮性,建议尽可能保证Start_Date字段的日期格式一致。如果日期格式不固定,可能需要更复杂的解析逻辑。错误处理:在实际应用中,json_decode()和strtotime()都可能失败。务必通过json_last_error()和json_last_error_msg()检查JSON解码错误,以及通过检查strtotime()的返回值(false)来处理日期解析失败的情况。数据路径检查:在访问$decodedData[“response”][“data”]或$item[“fieldData”][“Start_Date”]等深层嵌套数据时,使用isset()或空合并运算符??进行存在性检查,可以有效防止因数据结构不完整而导致的PHP警告或错误。性能考量:对于非常大的JSON数据集,每次迭代都调用strtotime()和date()可能会产生一定的性能开销。在极端情况下,可以考虑优化日期解析逻辑,例如预处理或使用更高效的日期时间库。多语言月份:date(“m”, …)输出的是数字月份。如果需要显示英文或本地化的月份名称,可以使用date(“M”, …)(缩写)或date(“F”, …)(完整名称),并结合PHP的国际化函数(如strftime或IntlDateFormatter)进行处理。

总结

本教程展示了如何利用PHP有效地解析JSON数据,并通过遍历、日期转换和条件计数,实现了按月份对特定字段进行数据聚合和统计。这种方法在处理日志、API响应或任何包含日期字段的结构化数据时非常实用。通过理解JSON结构、熟练运用json_decode()、strtotime()和date()等PHP函数,可以轻松实现复杂的数据分析需求。

以上就是使用PHP过滤JSON数据并按月份统计的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1322291.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月12日 08:28:11
下一篇 2025年12月12日 08:28:27

相关推荐

  • PHP解析错误深度剖析:字符串、代码嵌入与常见语法陷阱

    本文深入探讨了PHP解析错误,特别是当代码中包含不当终止的字符串和嵌入式脚本时。通过分析一个WordPress自定义主题中的实际案例,文章详细解释了如何诊断由字符串内未转义引号引起的unexpected ‘$’错误,并指出了嵌入式JavaScript代码中的潜在语法问题,提供…

    好文分享 2025年12月12日
    000
  • 解析PHP语法错误:理解unexpected ‘$’及字符串引号处理

    本文旨在深入探讨PHP中常见的Parse error: syntax error, unexpected ‘$’错误,特别是当它源于字符串字面量中未正确转义的引号时。我们将通过案例分析,详细阐述该错误的根源,并提供使用反斜杠转义、切换定界符(如Heredoc/Nowdoc)等…

    2025年12月12日
    000
  • Laravel图片处理:使用原生PHP实现原始图片与WebP格式共存存储

    本教程详细介绍了在Laravel项目中同时保存原始上传图片和其WebP转换版本的方法。文章指出Intervention Image库在特定保存路径问题上可能遇到的挑战,并提供了一个基于原生PHP GD库的解决方案。通过保存原始图片后,利用imagecreatefromstring和imagewebp…

    2025年12月12日
    000
  • 理解服务器端请求与浏览器开发者工具的可见性

    本文深入探讨了为何使用PHP的file_get_contents函数发起的服务器端请求无法在浏览器开发者工具的网络活动中观察到。核心原因在于浏览器仅能监控由其自身发出的请求,而file_get_contents是在服务器端执行的内部操作,与浏览器无关。我们将通过代码示例和请求流程分析,清晰阐述这一机…

    2025年12月12日
    000
  • 理解PHP服务器端请求与浏览器开发者工具的限制

    当PHP脚本使用file_get_contents等函数发起服务器端请求时,这些请求直接在服务器上执行,而非通过浏览器。因此,浏览器开发者工具的网络活动面板无法捕获和显示这些内部的服务器间通信,因为它仅监控浏览器自身发出的网络请求,对服务器内部处理过程无感知。 客户端请求与服务器端请求的本质区别 在…

    2025年12月12日
    000
  • PHP数组去重:根据指定键值保留最后一条记录的策略与实现

    本教程将详细介绍如何在PHP中处理复杂数组数据,特别是当数组中包含基于特定键(如order_date)的重复记录时。我们将学习一种高效的策略,通过结合array_reverse()和array_filter()函数,实现仅保留每个重复键值最新(即最后出现)记录的功能,并提供清晰的代码示例和实现步骤,…

    2025年12月12日
    000
  • PHP数组去重:基于日期保留最后一条记录的策略与实现

    本文将介绍如何在PHP中处理包含重复日期数据的数组,并仅保留每个日期最后出现的记录。通过巧妙结合array_reverse()和array_filter(),并利用静态变量跟踪已处理日期,可以高效地实现这一数据清洗需求,确保数据唯一性和最新性。 1. 问题描述 在处理包含时间序列数据的数组时,我们经…

    2025年12月12日
    000
  • 使用Carbon和Laravel高效按分钟比较日期时间

    本文探讨在PHP Laravel应用中,如何利用Carbon库在数据库查询中实现精确到分钟的日期时间比较,而非默认的秒级比较。主要介绍两种方法:利用startOfMinute()和endOfMinute()进行范围查询,以及使用DB::raw和DATE_FORMAT函数进行格式化比较,并分析它们的优…

    2025年12月12日
    000
  • PHP中高效解析JSON字符串并提取指定数据

    本文旨在指导读者如何在PHP中正确解析JSON格式的字符串数据,并从中提取所需的特定字段。文章将详细解释为何不能直接对JSON字符串进行数组式访问,并演示如何利用json_decode()函数将其转换为PHP关联数组,从而避免常见的“非法字符串偏移”错误,确保数据访问的准确性和高效性。 在现代web…

    2025年12月12日
    000
  • PHP面向对象:不使用构造函数初始化父类私有属性的策略

    本文探讨了在PHP类继承中,如何在不依赖传统构造函数__constructor的情况下,为父类的私有属性进行初始化。通过引入公共的设置方法,子类可以间接设置父类的私有数据,从而实现灵活的对象状态管理,同时保持良好的封装性。文章将通过具体代码示例,演示这一实现方式及其注意事项。 理解私有属性与继承的挑…

    2025年12月12日
    000
  • PHP如何连接MySQL数据库_PHP连接MySQL步骤与代码示例

    答案:PHP连接MySQL需确保服务器正常、扩展启用、权限与防火墙配置正确;推荐使用mysqli或PDO,其中PDO更安全且支持多数据库;通过预处理语句防SQL注入,统一UTF-8编码解决中文乱码,并优化连接、查询与缓存提升性能。 PHP连接MySQL数据库,简单来说,就是利用PHP提供的函数,建立…

    2025年12月12日
    000
  • 解决PHP foreach循环中变量“继承”问题:理解与避免意外数据泄露

    本文探讨PHP foreach循环中一个常见的陷阱:当循环内部的数组或变量未被显式初始化时,其值可能会“继承”自上一次循环迭代,导致意外的数据泄露和逻辑错误。文章将深入分析这一现象的根源,并通过示例代码展示如何通过在每次迭代开始时正确初始化变量来解决此问题,确保代码行为的预期一致性。 引言:fore…

    2025年12月12日
    000
  • 如何在 Laravel 中同时存储原始图像与 WebP 转换版本

    本文旨在提供在 Laravel 项目中同时保存原始上传图像(如 JPG/PNG)及其 WebP 转换版本的专业教程。我们将探讨两种主要方法:利用 PHP 内置的 GD 库进行高效转换,以及结合 Intervention Image 库与 Laravel Storage 门面进行灵活存储,并提供详细代…

    2025年12月12日
    000
  • PHP 面向对象编程:构造函数与对象关系的最佳实践

    在PHP面向对象编程中,正确使用构造函数和理解类之间的关系至关重要。本文将深入探讨__construct方法在对象初始化中的作用,并区分继承(is-a关系)与组合(has-a关系)的适用场景,通过一个实际案例,解决因构造函数缺失和不当继承导致的NULL值输出问题,帮助开发者构建更健壮、逻辑更清晰的代…

    2025年12月12日
    000
  • PHP文件权限缓存机制与clearstatcache()的应用

    本文深入探讨了PHP中fileperms()等文件状态函数因性能优化而引入的缓存机制。当文件权限在脚本执行期间发生变更时,PHP的内部缓存可能导致获取到不准确的旧权限信息。教程将详细介绍如何通过调用clearstatcache()函数来清除这些缓存,确保在多次操作文件权限后,始终能获取到最新的、准确…

    2025年12月12日
    000
  • 利用php数组函数去重数据_通过php数组函数优化数据去重性能

    答案:PHP数组去重推荐根据数据特点选择方法。array_unique适用于多数场景,保留首次出现的元素;对纯标量大数据,array_flip翻转两次更高效;需连续索引时结合array_values重置;性能敏感场景优先用C实现函数,避免手动遍历。 在PHP开发中,处理数组去重是常见需求,尤其在面对…

    2025年12月12日
    000
  • MediaWiki 共享数据库表配置与升级指南

    本教程详细阐述了在MediaWiki多站点环境下,如何正确配置共享数据库表($wgSharedTables),以实现用户、用户组等数据的共享。文章不仅纠正了常见的配置错误,还特别强调了在MediaWiki 1.21及更高版本升级过程中,为确保共享表正确处理,需要临时清空$wgSharedTables…

    2025年12月12日
    000
  • PHP preg_match 技巧:从字符串末尾提取特定格式数字

    本文详细介绍了如何使用 PHP 的 preg_match 函数和正则表达式,从字符串末尾精确提取一个数字。该数字必须由一个空格前导,且字符串不能以空格开头直接跟数字。文章通过分析常见错误模式,提供了一个健壮的正则表达式 ^S.* (bd+)$,并深入解析其构成,辅以代码示例和使用注意事项,旨在提升读…

    2025年12月12日
    000
  • MediaWiki共享数据库表初始化与$wgSharedTables配置指南

    本教程详细阐述了MediaWiki共享数据库表的正确初始化与配置方法,重点解决$wgSharedTables变量的常见配置误区及其在升级过程中的特殊处理要求。我们将介绍如何正确声明共享表,以及在MediaWiki升级时如何临时“清空”该变量,确保共享数据库功能正常运行。 MediaWiki共享数据库…

    2025年12月12日
    000
  • 解决Bootstrap网格布局错位问题:表单标签的正确放置

    本文旨在解决Bootstrap网格系统在渲染动态内容时出现的布局错位问题,尤其当:最关键的改动是将以上就是解决Bootstrap网格布局错位问题:表单标签的正确放置的详细内容,更多请关注php中文网其它相关文章!

    2025年12月12日
    000

发表回复

登录后才能评论
关注微信