PHP多维数组搜索问题:匹配关键词并获取对应条目ID
解决二维数组关键词匹配问题
我来帮你排查下当前代码的问题,然后给出靠谱的实现方案。
首先看你当前代码里的几个明显错误:
- 变量未定义:
$ResutItem = $item;这里的$item根本没声明过,你应该用当前循环的$itemkey(或者更清晰的变量名比如$item) - 拼写错误:
$searckKey应该是$searchKey,拼写错误会导致变量无法被正确识别 - 逻辑冗余:嵌套循环的顺序导致可能重复输出同一个条目(如果一个条目匹配多个关键词的话),而且没有提前终止匹配检查,效率偏低
正确实现方案1:用数组交集简化匹配逻辑
这种方式更简洁,尤其是当关键词数量变多的时候,不用手动写一堆||判断:
// 先补全你的数组(注意原$array2少了闭合的]) $array1 = ['Agriculture & Farming','Modern','Monograms']; $array2 = [ [1,"Agriculture & Farming","Bold","000"], [2,"Agriculture & Farming","Bold","f44336"], [3,"Agriculture & Farming","Bold","E91E63"], [4,"Agriculture & Farming","Bold","9C27B0"], [5,"Agriculture & Farming","Bold","673AB7"], [6,"Agriculture & Farming","Bold","3F51B5"], [7,"Agriculture & Farming","Bold","2196F3"] ]; $matchedIds = []; // 遍历二维数组的每个条目 foreach($array2 as $item) { // 取出当前条目里需要匹配的字段(索引1、2、3,也就是除了ID之外的部分) $itemFields = array_slice($item, 1); // 找当前条目字段和关键词数组的交集 $commonKeys = array_intersect($itemFields, $array1); // 如果有交集,说明匹配成功,收集ID if (!empty($commonKeys)) { $matchedIds[] = $item[0]; // 如果你需要收集整个条目,改成:$matchedIds[] = $item; } } // 输出结果 foreach($matchedIds as $id) { echo "匹配到的条目ID:{$id}<br>"; }
正确实现方案2:修正你原来的循环逻辑
如果你更习惯用嵌套循环的方式,也可以修正原有代码的问题:
$array1 = ['Agriculture & Farming','Modern','Monograms']; $array2 = [ [1,"Agriculture & Farming","Bold","000"], [2,"Agriculture & Farming","Bold","f44336"], [3,"Agriculture & Farming","Bold","E91E63"], [4,"Agriculture & Farming","Bold","9C27B0"], [5,"Agriculture & Farming","Bold","673AB7"], [6,"Agriculture & Farming","Bold","3F51B5"], [7,"Agriculture & Farming","Bold","2196F3"] ]; foreach($array2 as $item) { $k1 = $item[1]; $k2 = $item[2]; $k3 = $item[3]; $isMatched = false; // 遍历关键词数组,匹配到就标记并终止循环 foreach($array1 as $searchKey) { if ($searchKey == $k1 || $searchKey == $k2 || $searchKey == $k3) { $isMatched = true; break; } } // 只有匹配成功才输出 if ($isMatched) { echo implode(" ", $item) . '<br>'; } }
这两种方案都能正确返回匹配的条目ID(或整个条目),不会出现错误结果。
内容的提问来源于stack exchange,提问作者Sunil meena
相关产品推荐
相关产品推荐

