PHP使用similar_text循环匹配电影标题仅保留唯一100%匹配的问题
实现方案
原有代码问题梳理
- 逻辑顺序错误:匹配到单条数据库记录就立刻输出结果,没有先统计当前电影对应的所有匹配结果数量,自然无法识别多匹配场景
- 语法错误:
similar_text()返回的相似度$perc是0~100的浮点数,不是带%的字符串,原代码中$perc == '100 %'的判断本身就不成立 - 正则逻辑完全无效:正则表达式中的
%s是未替换的占位符,且该规则也无法实现统计匹配数量的需求 - switch写法错误:switch的case后应该直接写匹配值,原代码写的是布尔表达式,不符合switch的用法逻辑
正确实现思路
核心逻辑是先收集所有匹配结果,再按数量判断处理逻辑,不要匹配一条就处理一条:
- 对每一个待匹配的电影,先初始化容器存储所有符合条件的数据库匹配项
- 遍历所有数据库电影条目,计算相似度后把符合要求的条目分类存入容器
- 全部匹配完成后,根据100%匹配的数量决定输出逻辑:
- 100%匹配数量=1:输出该唯一匹配结果,走自动处理
- 100%匹配数量≥2:标记为待人工处理,不输出自动结果
- 无100%匹配时,再处理80%以上的匹配结果
示例代码
// 待匹配的电影数组 $movies = array(/* 存储所有待匹配电影对象 */); // 从数据库取到的所有电影条目数组 $db_movies = array(/* 数据库存储的所有电影条目 */); foreach ($movies as $movie) { // 初始化当前电影的匹配结果容器 $match_result = [ '100_percent' => [], '80_plus_percent' => [] ]; // 遍历所有数据库条目,收集所有匹配结果 foreach ($db_movies as $db_item) { similar_text($movie->title, $db_item->title, $perc); // $perc是浮点数,直接做数值比较 if ($perc == 100) { $match_result['100_percent'][] = $db_item; } elseif ($perc >= 80) { $match_result['80_plus_percent'][] = $db_item; } } // 收集完成后做判断 $hundred_count = count($match_result['100_percent']); if ($hundred_count === 1) { // 唯一100%匹配,输出结果 $match = $match_result['100_percent'][0]; echo "{$movie->title}: 100% 匹配到 {$match->title} \n"; // 后续自动处理逻辑写在这里 } elseif ($hundred_count >= 2) { // 多个100%匹配,留待人工处理 echo "{$movie->title}: 存在多个100%匹配,待人工处理\n"; // 可以把该电影和对应匹配项存入人工处理队列 } else { // 无100%匹配,处理80%以上的匹配,按需调整逻辑 $eighty_count = count($match_result['80_plus_percent']); if ($eighty_count > 0) { echo "{$movie->title}: 存在{$eighty_count}个80%以上匹配结果\n"; // 按需输出或者也转人工处理 } } }
优化建议
如果数据库条目量很大,遍历全库性能太低,可以提前给数据库电影标题加索引,先做模糊查询缩小匹配范围,再用similar_text做精确相似度计算,能大幅提升处理效率。
内容的提问来源于stack exchange,提问作者youwhatmate
相关产品推荐
相关产品推荐

