很抱歉打扰你,我花了很多时间在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
答案 0 :(得分:1)
我认为这是我能做的最好的事情。
对数组进行操作并使用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))
应该使它不区分大小写。
答案 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));
那会给你:
array(1) {
[0]=>
int(2)
}