PHP 处理 JSON 数据:按日期字段进行月度统计

DDD
发布: 2025-09-27 11:21:01
原创
237人浏览过

PHP 处理 JSON 数据:按日期字段进行月度统计

本文将指导您如何使用 PHP 解析复杂的 JSON 数据,并根据其中的日期字段(如 Start_Date)进行筛选和统计,最终按月份聚合计数。我们将详细讲解 json_decode、日期格式化以及数组统计等核心技术,帮助您高效处理类似的数据分析需求。

在实际开发中,我们经常需要从外部 api 或服务获取 json 格式的数据。这些数据通常包含多层嵌套结构,而我们的任务可能是从中提取特定信息,并进行聚合分析。本教程将以一个具体的场景为例,展示如何使用 php 对 json 输出进行过滤,并按照日期字段(例如 start_date)统计每个月的数据量。

1. JSON 数据结构概览

首先,我们来看一个典型的 JSON 数据结构示例。假设我们从某个 API 获得了以下数据:

{
    "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"
        }
    ]
}
登录后复制

我们的目标是从 response.data 数组中提取每个对象的 fieldData.Start_Date 字段,并统计每个月份出现的次数。

2. 使用 PHP 解析 JSON 数据

PHP 提供了 json_decode() 函数来将 JSON 字符串转换为 PHP 变量。为了方便后续操作,我们通常会将其解码为关联数组。

// 假设 $jsonString 是从 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"
        }
    ]
}';

$decodedData = json_decode($jsonString, true); // 第二个参数 true 表示解码为关联数组
登录后复制

解码后,$decodedData 将是一个 PHP 关联数组,我们可以像操作普通数组一样访问其内部元素。

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

3. 提取日期并按月份统计

核心逻辑在于遍历 response.data 数组中的每个数据项,提取 Start_Date,然后将其转换为月份,并进行计数。

我们将使用一个空数组 $monthlyCounts 来存储每个月份的统计结果。

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
$monthlyCounts = []; // 用于存储按月份统计的结果

// 确保 'response' 和 'data' 键存在,以避免错误
if (isset($decodedData['response']['data']) && is_array($decodedData['response']['data'])) {
    $items = $decodedData['response']['data'];

    foreach ($items as $item) {
        // 检查 'fieldData' 和 'Start_Date' 键是否存在
        if (isset($item['fieldData']['Start_Date'])) {
            $startDateString = $item['fieldData']['Start_Date'];

            // 将日期字符串转换为 Unix 时间戳,然后提取月份
            // strtotime() 可以解析多种日期时间格式
            // date("m", ...) 将时间戳格式化为两位数的月份(01-12)
            $month = date("m", strtotime($startDateString));

            // 如果该月份尚未在统计数组中,则初始化为 0
            // 否则,直接递增该月份的计数
            $monthlyCounts[$month] = ($monthlyCounts[$month] ?? 0) + 1;
        }
    }
}

// 输出统计结果
print_r($monthlyCounts);
登录后复制

代码解释:

  • $monthlyCounts = [];:初始化一个空数组,用于存放最终的统计结果,键为月份,值为该月份的记录数。
  • $items = $decodedData["response"]["data"];:获取 JSON 中实际的数据列表。
  • foreach ($items as $item):遍历数据列表中的每一个记录。
  • $startDateString = $item["fieldData"]["Start_Date"];:从当前记录中提取 Start_Date 字符串。
  • strtotime($startDateString):将日期字符串(例如 "10/03/2021")转换为 Unix 时间戳。这是一个非常灵活的函数,能够识别多种日期格式。
  • date("m", ...):将 Unix 时间戳格式化为两位数的月份(例如 "10" 或 "11")。
  • $monthlyCounts[$month] = ($monthlyCounts[$month] ?? 0) + 1;:这是 PHP 7+ 的空合并运算符 (??) 的用法,它比 if(!isset($months[$month])) $months[$month] = 0; 更简洁。如果 $monthlyCounts[$month] 不存在或为 null,则使用 0 作为初始值,然后加 1;否则直接将现有值加 1。

4. 完整示例代码

将上述步骤整合,我们可以得到一个完整的 PHP 脚本:

<?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"
        }
    ]
}';

// 1. 解析 JSON 字符串为 PHP 关联数组
$decodedData = json_decode($jsonString, true);

// 检查 JSON 解析是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
    echo "JSON 解析错误: " . json_last_error_msg() . "\n";
    exit;
}

$monthlyCounts = []; // 用于存储按月份统计的结果

// 2. 遍历数据并进行统计
if (isset($decodedData['response']['data']) && is_array($decodedData['response']['data'])) {
    $items = $decodedData['response']['data'];

    foreach ($items as $item) {
        // 确保 'fieldData' 和 'Start_Date' 键存在
        if (isset($item['fieldData']['Start_Date'])) {
            $startDateString = $item['fieldData']['Start_Date'];

            // 将日期字符串转换为月份
            $month = date("m", strtotime($startDateString));

            // 统计每个月份的记录数
            $monthlyCounts[$month] = ($monthlyCounts[$month] ?? 0) + 1;
        } else {
            // 可选:处理缺少 Start_Date 字段的情况
            // echo "警告:发现缺少 'Start_Date' 字段的记录。\n";
        }
    }
} else {
    echo "错误:JSON 数据中未找到 'response.data' 路径或其不是一个数组。\n";
}

// 3. 输出统计结果
echo "按月份统计的记录数:\n";
print_r($monthlyCounts);

?>
登录后复制

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

按月份统计的记录数:
Array
(
    [10] => 1
    [11] => 3
)
登录后复制

这表示在给定的数据中,10月份有一条记录,11月份有三条记录。

5. 注意事项与最佳实践

  • 错误处理: 在实际应用中,务必对 json_decode() 的结果进行检查。json_last_error() 和 json_last_error_msg() 函数可以帮助您判断 JSON 解析是否成功以及具体的错误信息。
  • 数据路径检查: 在访问深层嵌套的数组键之前,使用 isset() 或空合并运算符 (??) 进行检查是一个好习惯,可以避免因键不存在而导致的 PHP 警告或错误。
  • 日期格式: strtotime() 函数在解析日期字符串方面非常强大,但对于不常见的或格式不一致的日期字符串,可能会出现问题。如果日期格式不固定,可能需要更健壮的日期解析逻辑(例如使用 DateTime::createFromFormat())。
  • 性能: 对于非常大的数据集,循环遍历可能成为性能瓶颈。虽然对于大多数 Web 应用场景,这种方法足够高效,但如果处理百万级别的数据,可能需要考虑数据库聚合查询或更优化的数据处理方案。
  • 可读性: 使用有意义的变量名,并适当地添加注释,可以大大提高代码的可读性和可维护性。

通过本教程,您应该已经掌握了使用 PHP 解析 JSON 数据、提取特定字段并进行按月份统计的基本方法。这些技术是处理和分析复杂数据结构的基础,在各种 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号