如何用PHP找出两个JSON通知数据源中独有的标题?
用PHP实现两个通知数据源的标题对比与新内容触发
嘿,这个需求其实挺常见的,我来给你一步步拆解怎么实现~
核心思路
我们需要完成这几个关键步骤:
- 把JSON格式的数据源转换成PHP可操作的数组
- 分别提取两个数据源里的所有标题
- 找出主数据源中独有的、现有数据源没有的标题
- 如果存在这类标题,触发你指定的函数
完整代码示例
第一步:处理数据源解码
首先假设你已经获取到了两个JSON字符串(爬取的主数据源和现有数据源),先把它们解码成PHP数组:
// 爬取的主通知数据源JSON $mainNotificationJson = '[{"title":"2024年春季招聘会通知","content":"详情请查看官网"},{"title":"新员工入职培训安排","content":"下周一开展"}]'; // 现有通知数据源JSON $existingNotificationJson = '[{"title":"2024年春季招聘会通知","content":"详情请查看官网"},{"title":"春节放假通知","content":"10天假期"}]'; // 解码为关联数组(第二个参数true确保转成数组而非对象) $mainData = json_decode($mainNotificationJson, true); $existingData = json_decode($existingNotificationJson, true); // 别忘了处理JSON解码失败的情况! if (json_last_error() !== JSON_ERROR_NONE) { die("主数据源JSON解析出错,请检查格式"); } if (json_last_error() !== JSON_ERROR_NONE) { die("现有数据源JSON解析出错,请检查格式"); }
第二步:提取标题数组
用array_column可以快速从多维数组中提取指定字段(这里是title):
// 提取主数据源的所有标题 $mainTitles = array_column($mainData, 'title'); // 提取现有数据源的所有标题 $existingTitles = array_column($existingData, 'title'); // 可选:如果主数据源本身有重复标题,先去重 $mainTitles = array_unique($mainTitles);
第三步:找出独有的标题
用array_diff函数就能直接对比两个数组,得到主数据源独有的元素:
// 获取主数据源独有的标题 $uniqueNewTitles = array_diff($mainTitles, $existingTitles);
第四步:触发指定函数
如果存在独有的标题,就调用你定义的函数:
// 定义你要触发的业务函数,比如发送通知、写入数据库等 function handleNewNotifications($newTitles) { // 这里写你的具体逻辑,示例:输出新通知 echo "发现" . count($newTitles) . "条新通知:" . PHP_EOL; foreach ($newTitles as $title) { echo "- " . $title . PHP_EOL; } // 你也可以在这里加邮件推送、接口调用等逻辑 } // 判断是否有新通知,有则触发函数 if (!empty($uniqueNewTitles)) { handleNewNotifications($uniqueNewTitles); } else { echo "没有发现新通知"; }
进阶优化点
1. 大小写不敏感对比
如果标题存在大小写差异但实际是同一个内容(比如“新员工培训”和“新员工培训”),可以统一转成小写再对比:
// 转成小写后对比 $mainTitlesLower = array_map('strtolower', $mainTitles); $existingTitlesLower = array_map('strtolower', $existingTitles); $uniqueNewTitles = array_diff($mainTitlesLower, $existingTitlesLower); // 如果需要保留原标题,用array_filter实现 $uniqueNewTitles = array_filter($mainTitles, function($title) use ($existingTitles) { return !in_array(strtolower($title), array_map('strtolower', $existingTitles)); });
2. 更精准的匹配(比如忽略空格/特殊字符)
如果标题可能存在空格、标点差异,还可以先清洗标题再对比:
function cleanTitle($title) { // 去除首尾空格、特殊字符,统一转小写 return strtolower(trim(preg_replace('/[^\w\s]/u', '', $title))); } $cleanMainTitles = array_map('cleanTitle', $mainTitles); $cleanExistingTitles = array_map('cleanTitle', $existingTitles); $uniqueNewTitles = array_diff($cleanMainTitles, $cleanExistingTitles);
总结
这套逻辑基本能覆盖你的需求,你可以根据实际场景调整清洗规则、错误处理和触发函数的业务逻辑~
内容的提问来源于stack exchange,提问作者eatherpro
相关产品推荐
相关产品推荐

