如何在 PHP 数组中实现子字符串模糊匹配(而非完全相等)

本文介绍如何在 php 中判断指定子字符串是否出现在数组的任意元素中,而非要求整个字符串完全匹配,通过自定义函数结合 `strpos()` 实现高效、准确的局部匹配。

在 PHP 开发中,in_array() 只能进行全值精确匹配,例如 $string === "world" 才会返回 true。但实际业务中,我们常需判断某个关键词(如 "wor")是否作为子串出现在数组某元素内部(如 "world"),此时必须借助字符串查找函数。

推荐使用以下封装函数实现灵活匹配:

function containsSubstringInArray(array $array, string $keyword): bool {
    foreach ($array as $item) {
        if (is_string($item) && strpos($item, $keyword) !== false) {
            return true;
        }
    }
    return false;
}

// 使用示例
$array = ["hello", "world", "!"];
$string = "wor";

if (containsSubstringInArray($array, $string)) {
    echo "match"; // 输出:match
} else {
    echo "not match";
}

优势说明

  • 返回布尔值,语义清晰,适配 if 条件判断;
  • 显式类型检查(is_string())避免对非字符串元素调用 strpos() 报错;
  • 时间复杂度为 O(n×m),适用于中小规模数组,性能可控。

⚠️ 注意事项

  • strpos() 区分大小写,如需忽略大小写,请改用 stripos();
  • 若需支持正则高级匹配(如单词边界 \bword\b),应改用 preg_grep();
  • 原问题中 in_array($string, [$array]) 存在语法错误——[$array] 会创建一个包含数组的二维数组,应避免。

总结:替代 in_array() 进行子串搜索时,优先选择轻量级 foreach + strpos() 方案,兼顾可读性、健壮性与执行效率。