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

碧海醫心
发布: 2025-09-27 12:48:11
原创
166人浏览过

使用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变量中。

<?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;
}

// 提取我们感兴趣的数据数组
$items = $decodedData["response"]["data"];
?>
登录后复制

3. 按月份统计数据

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

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

我们将使用以下步骤:

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. 初始化一个空数组:用于存储每个月份的计数。
  2. 遍历数据项:对$items数组中的每个元素执行操作。
  3. 提取日期并转换为月份
    • 使用strtotime()函数将日期字符串(例如 "10/03/2021")转换为Unix时间戳。
    • 使用date("m", $timestamp)函数将Unix时间戳格式化为两位数的月份(例如 "10" 或 "11")。
  4. 更新月份计数
    • 检查当前月份是否已存在于统计数组中。如果不存在,则将其初始化为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 "<h3>按月份统计结果:</h3>";
print_r($months);

echo "\n<br>";

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

?>
登录后复制

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 "<h3>原始统计数组输出:</h3>";
print_r($months);

echo "<h3>格式化统计结果:</h3>";
foreach ($months as $monthNum => $count) {
    echo "Month " . intval($monthNum) . ": " . $count . "<br>";
}

?>
登录后复制

5. 预期输出

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

<h3>原始统计数组输出:</h3>
Array
(
    [10] => 1
    [11] => 3
)
<h3>格式化统计结果:</h3>
Month 10: 1
Month 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中文网其它相关文章!

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号