我将尽力解释我的情况,所以请多多包涵。
我有一个包含单词的数组,例如:
This is a test array
现在,我创建了另一个看起来相似但带有2个单词的数组,看起来像这样:
This is is a a test test array
好的,这是我的问题开始的地方。我有一个“常用词”数组,这些单词应从数组中排除。假设在本例中这些常用词是is
and a
。现在,我首先在单个单词数组上搜索常见单词,因此我可以使用if(in_array($word, $common_words)) continue;
which使其跳过一个(如果它位于common_words数组中)。
但这将导致此数组:
This test test array
但这不是我希望它发生的方式。应该是这样的:
test array
因为这是在我们开始取出“ common_words”之前,最初这两个单词彼此相邻的唯一一个单词。(你还在听我说吗?)
这里的问题是,if(in_array)
如果我有一个包含2个单词的数组,它将不再起作用。所以我做了一些研究,偶然发现了这个array_filter
命令。我认为这是我所需要的,但是我对如何使用/将其应用于我的代码一无所知。
我希望我对它的解释足够好,让您了解我的问题,如果有人可以帮助我,我将不胜感激。
提前致谢!
您的猜测是正确的,可以使用:
$array = ['this is', 'array array', 'an array', 'test array'];
$stop = ['is', 'test'];
$array = array_filter($array, function($x) use ($stop)
{
return !preg_match('/('.join(')|(', $stop).')/', $x);
});
-ie使用模式排除其中带有某些单词的所有项目 array_filter()
这将与过滤一起使用,因为它将通过regex进行匹配,即从中$stop
获取regex(is)|(test)
一个好主意是分别评估正则表达式,因此不要在每次array_filter()
迭代内都对其进行评估,例如:
$array = ['this is', 'array array', 'an array', 'test array'];
$stop = ['is', 'test'];
$pattern = '/('.join(')|(', $stop).')/';
$array = array_filter($array, function($x) use ($pattern)
{
return !preg_match($pattern, $x);
});
重要说明#1:如果停用词可能包含一些特殊字符,这些特殊字符将在正则表达式中以特殊方式处理,则需要使用以下命令preg_quote()
:
$pattern = '/'.join('|', array_map(function($x)
{
return '('.preg_quote($x, '/').')';
}, $stop)).'/';
$array = array_filter($array, function($x) use ($pattern)
{
return !preg_match($pattern, $x);
});
重要说明#2:如果停用词数组过长,则可能由于其长度(太大)而导致regex编译失败。有一些技巧可以克服它,但如果是您的情况,则最好strpos()
改用以下方法:
$array = array_filter($array, function($x) use ($stop)
{
foreach($stop as $word)
{
if(false!==strpos($x, $word))
{
return false;
}
}
return true;
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句