PHP - 在多维数组中查找字符串的一部分,其中包含单词

时间:2018-05-22 10:00:06

标签: php arrays string sub-array

很抱歉打扰你,我花了很多时间在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)。但我想我别无选择,只能“爆炸”这句话并至少“预告”它。

该项目使用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

2 个答案:

答案 0 :(得分:1)

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

对数组进行操作并使用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))
应该使它不区分大小写。

答案 1 :(得分:0)

如果您爆炸$sentence并使用空格作为分隔符,您将获得一系列单词。

您可以使用array_filter$array中删除这些数组,方法是使用array_intersect检查相交是否包含1个或多个单词。

然后你可以使用array_keys返回一个数组来获取包含你句子中的单词的所有id。

$array = array (
    "1" => array("fruit","salad","vegetable"),
    "2" => array("beef","meat","sausage"),
    "3" => array("chocolate","cake","bread")
);

$expl = explode(' ', "I love big sausage");
$array = array_filter($array, function($x) use ($expl) {
    return count(array_intersect($expl, $x)) > 0;
});
var_dump(array_keys($array));

Demo

那会给你:

array(1) {
  [0]=>
  int(2)
}