PHP使用array_intersect同时匹配多个值的问题排查
问题原因
- 原代码将匹配数量校验放在了交集结果的遍历循环内,逻辑层级错误,且没有提前处理匹配失败的分支
- 没有对搜索词做去重处理,若传入重复搜索词会导致计数判断异常
- 未单独处理匹配失败的返回逻辑,才会出现部分命中就输出内容的问题
修正后实现代码
<?php $values = "Jhon,Smith,252546,34,house,car,phone"; $post = "Jhon 34"; // 拆分目标值字符串和搜索词字符串 $exp_values = explode(",", $values); $exp_post = explode(" ", $post); // 搜索词去重,避免重复输入的搜索词导致计数偏差 $unique_post = array_unique($exp_post); // 计算搜索词和目标值的交集 $match_result = array_intersect($unique_post, $exp_values); // 优先校验是否所有搜索词都命中 if (count($match_result) === count($unique_post)) { // 全部命中时输出结果 echo "所有搜索词均命中,命中内容如下:<br>"; foreach ($match_result as $item) { echo $item . "<br>"; } } else { // 存在未命中搜索词时直接返回错误 echo "错误:存在未命中的搜索词,校验失败"; } ?>
逻辑说明
- 支持2个、3个甚至更多搜索词的校验需求,只要交集数量和去重后的搜索词数量一致,就判定为全部命中
- 提前做去重处理,即使用户重复输入同一个搜索词也不会影响校验结果
- 两个分支独立处理,只有全部命中才会输出内容,否则直接返回错误,符合需求
内容的提问来源于stack exchange,提问作者José Ricardo Cotón Suárez
相关产品推荐
相关产品推荐

