php - PHP - 在带有单词列表的多维数组中查找字符串的一部分
问题描述
很抱歉打扰你,我花了很多时间在 StackOverflow 上寻找解决方案,但它总是一个不同类型的问题。
这是我的问题:
$array = array (
"1" => array("fruit","salad","vegetable"),
"2" => array("beef","meat","sausage"),
"3" => array("chocolate","cake","bread")
);
$sentence = "I love big sausage"; // if it can work with sausageS it's even better
我需要将一个句子关联到一个类别,所以我需要分析该句子并返回与该句子匹配的子数组的 ID。例如我的例子中的“2”。
我正在寻找性能最佳的解决方案(所以我想避免多个 foreach / while / for)。但我想我别无选择,只能“爆炸”这句话并至少“foreach”它。
该项目使用 PHP7,如果它可以使用惊人的本机功能,那就太好了。
如果更容易处理,可以将数组格式化如下:
$array = array (
"1" => array("id" => "1", "words" => "fruit,salad,vegetable"),
"2" => array("id" => "2", "words" => "beef,meat,sausage"),
"3" => array("id" => "3", "words" => "chocolate,cake,bread")
);
非常感谢 !<3
解决方案
我认为这是我能做的最好的。
Foreach 数组并使用 preg_grep 查找匹配项。
我使用 str_replace 将空格替换为 | 在正则表达式中用作“或”。
foreach($array as $key => $sub){
if(preg_grep("/" . str_replace(" ", "|", $sentence) . "/" ,$sub )){
echo "Match in ". $key . "\n";
}
}
要匹配您的 sussageS 示例,您可以反向搜索并添加
.*?
grep。
$arrSent = explode(" ", $sentence);
foreach($array as $key => $sub){
if(preg_grep("/" . implode(".*?|", $sub) . ".*?/" , $arrSent))
{
echo "Match in ". $key . "\n";
}
}
但这也会接受sussage_and_beans
。如果您只想匹配该单词是否为复数形式(s
最后添加一个)。更改.*?
为s
。
但这将区分大小写,因此您的示例中的 sussageS 将不起作用。
但与 :if(preg_grep("/" . implode("s|", $sub) . "s/i" , $arrSent))
应该使它不区分大小写。
推荐阅读
- regex - 需要帮助检查我的 CFG 问题是否正确
- java - 将 if/else 转换为三元运算符 Java
- excel - Excel公式对多个工作表的单元格求和
- amazon-web-services - 将使用计划附加到公共 Api 网关端点
- android - 更新 Android Studio 后无法放置视图
- python - 错误:方法调用中的参数“coro”没有值,并且未定义变量错误
- mysql - 如果其中一个短语有错字,则 Sqlite3 fts5 搜索不返回任何内容
- r - R studio 图表未绘制(x11() 均未绘制)
- reactjs - Googlebot 如何判断单页应用程序上的页面是否已完成呈现?
- java - 映射处理器作为spring maven项目中的插件