17370845950

如何按日期和网站名去重并保留最大粉丝数的对象

本文介绍如何对嵌套 json 数据按 `date` 分组,再在每组的 `websites` 数组中基于 `website_name` 去重,并仅保留 `num_followers` 数值最大的对象(字符串数值按字典序比较时需注意,实际应转为整型确保正确性)。

在社交媒体数据聚合场景中,常会遇到同一日期下多个同名平台(如多个 "instagram")记录,但只需保留粉丝数最高的那条。原始数据结构为日期数组,每项含 websites 子数组,目标是:每个 date 下,每个 website_name 仅保留一条记录,且该记录的 num_followers 为该名称下的最大值

实现逻辑分三步:

  1. 按日期遍历:对输入 JSON 解析后的每条日期数据单独处理;
  2. 按网站名聚合:使用关联数组以 website_name 为键,动态维护当前已见的

    最大 num_followers 对应的对象;
  3. 类型安全比较:由于 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 为该日期该网站的最大值。

此方案简洁、可读性强,兼顾健壮性与性能,可直接集成至数据清洗管道中。