
本文介绍如何对嵌套 json 数据按 `date` 分组,再在每组的 `websites` 数组中基于 `website_name` 去重,并仅保留 `num_followers` 数值最大的对象(字符串数值按字典序比较时需注意,实际应转为整型确保正确性)。
在社交媒体数据聚合场景中,常会遇到同一日期下多个同名平台(如多个 "instagram")记录,但只需保留粉丝数最高的那条。原始数据结构为日期数组,每项含 websites 子数组,目标是:每个 date 下,每个 website_name 仅保留一条记录,且该记录的 num_followers 为该名称下的最大值。
实现逻辑分三步:
- 按日期遍历:对输入 JSON 解析后的每条日期数据单独处理;
- 按网站名聚合:使用关联数组以 website_name 为键,动态维护当前已见的最大 num_followers 对应的对象;
- 类型安全比较:由于 num_followers 在示例中为字符串(如 "123146780"),直接字符串比较在位数相同时有效,但为健壮性,强烈建议转换为整型比较,避免 "9" > "1000" 类错误。
以下是完整、可运行的 PHP 示例代码(含类型转换与注释优化):
(int)$sites[$name]['num_followers']) {
$sites[$name] = $site;
}
}
// 将关联数组重置为索引数组,保持输出格式一致
$data[] = [
'date' => $day['date'],
'websites' => array_values($sites)
];
}
// 输出标准化 JSON(缩进格式便于查看)
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
?>注意事项与最佳实践:
- ? num_followers 字段若始终为纯数字字符串,(int) 转换安全;若可能含逗号或单位(如 "12.3M"),需先清洗再解析;
- ? 时间复杂度为 O(n)(n 为总网站对象数),空间复杂度 O(k)(k 为不重复网站名总数),高效适用于万级数据;
- ? 如需兼容 JavaScript 环境,可用 Array.reduce() + Map 实现类似逻辑,核心思想一致:用 Map 缓存各网站名对应的最大对象,遍历中动态更新;
- ? 最终结果严格满足要求:每个日期下每个网站名唯一,且 num_followers 为该日期该网站的最大值。
此方案简洁、可读性强,兼顾健壮性与性能,可直接集成至数据清洗管道中。










