PHP如何实现多维数组指定字段的模糊匹配查找
PHP 数组模糊检索改造方案
问题现状
原有searchItem函数仅支持检索键值与输入内容完全相等的数组元素,当输入内容为目标字段值的片段时(例如目标值为banana: Bits received,输入Bits received),无法返回匹配结果,需要改造为支持关键词片段命中的模糊检索能力。
核心改造逻辑
将原函数中精确相等判断的逻辑,替换为子串包含检测即可实现基础模糊匹配。使用strpos/stripos做包含判断可兼容所有PHP版本,支持配置是否区分大小写。
可直接使用的实现代码
<?php echo "<pre>"; $array = [ [ "id" => "33704", "name" => "Total apple" ], [ "id" => "33706", "name" => "Used apple" ], [ "id" => "33694", "name" => "banana: Bits received" ], [ "id" => "33697", "name" => "banana: Bits sent" ] ]; /** * 数组模糊检索函数 * @param array $array 待检索的数组 * @param string $key 要匹配的键名 * @param string $keyword 检索关键词(支持片段匹配) * @param bool $caseSensitive 是否区分大小写,默认不区分 * @return array 匹配到的结果集合 */ function fuzzySearchItem(array $array, string $key, string $keyword, bool $caseSensitive = false): array { $results = []; // 空关键词直接返回空结果,避免无效遍历 if (trim($keyword) === '') { return $results; } foreach ($array as $item) { if (is_array($item)) { // 检测当前节点是否存在待匹配的键 if (isset($item[$key])) { $match = false; if ($caseSensitive) { // 区分大小写的包含判断,兼容PHP5.4+全版本 $match = strpos($item[$key], $keyword) !== false; } else { // 不区分大小写的包含判断,兼容PHP5.4+全版本 $match = stripos($item[$key], $keyword) !== false; } if ($match) { $results[] = $item; } } // 递归检索子数组 $results = array_merge($results, fuzzySearchItem($item, $key, $keyword, $caseSensitive)); } } return $results; } // 测试:传入片段关键词检索 $result = fuzzySearchItem($array, 'name', 'Bits received'); print_r($result);
匹配效果说明
- 传入完整值
banana: Bits received可正常命中对应元素 - 传入片段值
Bits received、bits received(小写)、banana均可命中对应元素 - 传入
apple会同时命中Total apple和Used apple两条记录,符合模糊检索预期 - 支持通过
$caseSensitive参数切换是否开启大小写敏感匹配
可选增强能力
如果业务有更复杂的匹配需求,可替换匹配逻辑实现对应效果:
- 多关键词匹配:将输入关键词按空格/指定分隔符拆分,要求字段值同时包含所有拆分后的关键词才判定为命中,适合多条件组合检索场景
- 正则匹配:将包含判断逻辑替换为
preg_match,支持前缀匹配、后缀匹配、格式校验等更灵活的自定义规则 - 结果权重排序:按照关键词在字段值中的出现位置、匹配片段长度对结果排序,匹配度越高的结果排位越靠前,优化检索体验
- 性能优化:如果待检索数组是固定维度(比如示例中为固定二维数组),可以移除递归逻辑直接遍历目标层级,减少不必要的函数调用开销,检索速度更快
内容的提问来源于stack exchange,提问作者Bien Albert
相关产品推荐
相关产品推荐

