You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP找出两个JSON通知数据源中独有的标题?

用PHP实现两个通知数据源的标题对比与新内容触发

嘿,这个需求其实挺常见的,我来给你一步步拆解怎么实现~

核心思路

我们需要完成这几个关键步骤:

  1. 把JSON格式的数据源转换成PHP可操作的数组
  2. 分别提取两个数据源里的所有标题
  3. 找出主数据源中独有的、现有数据源没有的标题
  4. 如果存在这类标题,触发你指定的函数

完整代码示例

第一步:处理数据源解码

首先假设你已经获取到了两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:23:02