首页 > 解决方案 > 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

标签: phparraysstringsub-array

解决方案


我认为这是我能做的最好的。

Foreach 数组并使用 preg_grep 查找匹配项。
我使用 str_replace 将空格替换为 | 在正则表达式中用作“或”。

foreach($array as $key => $sub){
    if(preg_grep("/" . str_replace(" ", "|", $sentence) . "/" ,$sub )){
        echo "Match in ". $key . "\n";
    }
}

https://3v4l.org/BqkW2


要匹配您的 sussageS 示例,您可以反向搜索并添加.*?grep。

$arrSent = explode(" ", $sentence);
foreach($array as $key => $sub){
    if(preg_grep("/" . implode(".*?|", $sub) . ".*?/" , $arrSent))    
    {
        echo "Match in ". $key . "\n";
    }
}

https://3v4l.org/MJqrv

但这也会接受sussage_and_beans。如果您只想匹配该单词是否为复数形式(s最后添加一个)。更改.*?s
但这将区分大小写,因此您的示例中的 sussageS 将不起作用。
但与 :if(preg_grep("/" . implode("s|", $sub) . "s/i" , $arrSent))
应该使它不区分大小写。


推荐阅读