PHP多维数组单/多关键词搜索需求及示例数组
PHP多维数组关键词搜索解决方案
嘿,我来帮你搞定这个多维数组的关键词搜索需求!咱们直接上实用的代码和思路,保证你能快速复用。
首先,我先补全了你给出的示例数组(方便演示),然后写一个通用的搜索函数,支持单个或多个关键词,返回所有包含任意匹配关键词的子数组。
完整实现代码
// 补全后的示例多维数组 $array = [ [ 'First_name' => 'Dina', 'Last_Name' => 'Gomez', 'Location' => 'Los Angeles, CA', 'Work' => 'Youtube Service' ], [ 'First_name' => 'Lopa', 'Last_Name' => 'Mitchel', 'Location' => 'New York, NY', 'Work' => 'Works with Mark' ], [ 'First_name' => 'Mark', 'Last_Name' => 'Taylor', 'Location' => 'Chicago, IL', 'Work' => 'Freelance Developer' ] ]; /** * 搜索多维数组,返回包含任意关键词的子数组 * @param array $array 要搜索的多维数组 * @param string|array $keywords 单个关键词(字符串)或多个关键词(数组) * @return array 匹配的子数组集合 */ function searchMultiArray($array, $keywords) { // 统一把关键词转成数组,同时转小写实现不区分大小写搜索(不需要区分的话去掉strtolower) $lowerKeywords = array_map('strtolower', (array)$keywords); $matchedItems = []; foreach ($array as $subArray) { $isMatched = false; // 遍历子数组的每一个值,检查是否包含关键词 foreach ($subArray as $value) { $lowerValue = strtolower($value); foreach ($lowerKeywords as $keyword) { // PHP 8+用str_contains,低版本可以换成strpos($lowerValue, $keyword) !== false if (str_contains($lowerValue, $keyword)) { $isMatched = true; break 2; // 找到匹配直接跳出两层循环,不用继续检查 } } } if ($isMatched) { $matchedItems[] = $subArray; } } return $matchedItems; } // 示例1:单个关键词搜索(搜索"mark") $singleKeywordResult = searchMultiArray($array, 'mark'); echo "单个关键词搜索结果:\n"; print_r($singleKeywordResult); // 示例2:两个关键词搜索(搜索"los angeles"或"developer") $twoKeywordsResult = searchMultiArray($array, ['los angeles', 'developer']); echo "\n两个关键词搜索结果:\n"; print_r($twoKeywordsResult);
关键细节说明
- 不区分大小写搜索:代码里把关键词和数组值都转成了小写,如果你需要严格区分大小写,直接去掉所有
strtolower的调用就行。 - 兼容PHP版本:如果你的PHP版本低于8.0,把
str_contains替换成strpos($lowerValue, $keyword) !== false就可以正常运行。 - 灵活的关键词参数:既可以传单个字符串关键词,也可以传多个关键词的数组,函数会自动处理。
- 效率优化:一旦在某个子数组里找到匹配的关键词,就用
break 2跳出内层的两层循环,避免不必要的遍历。
扩展玩法
如果你需要更精准的搜索,比如只搜索特定字段(比如只搜First_name和Work),可以修改内层循环,只遍历指定字段:
// 替换原来的内层foreach $targetFields = ['First_name', 'Work']; foreach ($targetFields as $field) { if (!isset($subArray[$field])) continue; $lowerValue = strtolower($subArray[$field]); foreach ($lowerKeywords as $keyword) { if (str_contains($lowerValue, $keyword)) { $isMatched = true; break 2; } } }
如果需要精确匹配(而不是包含关键词),把str_contains改成$lowerValue === $keyword即可。
内容的提问来源于stack exchange,提问作者I Am Stack
相关产品推荐
相关产品推荐

