
在实际开发中,我们经常需要从外部 api 或服务获取 json 格式的数据。这些数据通常包含多层嵌套结构,而我们的任务可能是从中提取特定信息,并进行聚合分析。本教程将以一个具体的场景为例,展示如何使用 php 对 json 输出进行过滤,并按照日期字段(例如 start_date)统计每个月的数据量。
首先,我们来看一个典型的 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 字段,并统计每个月份出现的次数。
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免费学习笔记(深入)”;
核心逻辑在于遍历 response.data 数组中的每个数据项,提取 Start_Date,然后将其转换为月份,并进行计数。
我们将使用一个空数组 $monthlyCounts 来存储每个月份的统计结果。
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
$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);代码解释:
将上述步骤整合,我们可以得到一个完整的 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月份有三条记录。
通过本教程,您应该已经掌握了使用 PHP 解析 JSON 数据、提取特定字段并进行按月份统计的基本方法。这些技术是处理和分析复杂数据结构的基础,在各种 PHP 项目中都非常实用。
以上就是PHP 处理 JSON 数据:按日期字段进行月度统计的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号