我会尽力解释我的情况,所以请耐心等待。
我有一个包含单个单词的数组,例如:
This
is
a
test
array
现在我创建了另一个看起来相似但有2个单词的数组,如下所示:
This is
is a
a test
test array
好的,这是我的问题开始的地方。我有一系列“常用词”,这些词应该从数组中排除。假设这个例子的常用词是is
和a
。现在我首先在单个单词数组上搜索常用单词,这样我就可以使用if(in_array($word, $common_words)) continue;
如果它在common_words数组中,它会跳过它。
但这会产生这个数组:
This test
test array
但这不是我希望它发生的方式。它应该是这样的:
test array
因为在我们开始取出'common_words'之前,这是唯一一个在彼此旁边有这两个单词的人。 (你还和我在一起吗?)
这里的问题是如果我有一个包含2个单词的数组,if(in_array)
就不再起作用了。所以我做了一些研究,偶然发现了array_filter
命令。我认为这是我需要的,但我完全不知道如何使用/应用它到我的代码。
我希望我能够很好地解释你的问题,如果有人可以帮助我,我会很感激。
提前致谢!
答案 0 :(得分:3)
您的猜测是正确的,您可以使用:
$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);
});
-i.e。使用array_filter()
这适用于过滤,因为它会匹配 by regex ,即来自$stop
我们将获得正则表达式(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()
,如:< / p>
$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 :如果你的停用词数组太长,这可能会导致正则表达式编译失败,因为它的长度(太大)。有一些技巧可以克服它,但如果是你的情况,你最好使用strpos()
代替:
$array = array_filter($array, function($x) use ($stop)
{
foreach($stop as $word)
{
if(false!==strpos($x, $word))
{
return false;
}
}
return true;
});
答案 1 :(得分:0)
我认为,bes方式,两个运算符:array_diff和array_unique
$a[] = 'This';
$a[] = 'is';
$a[] = 'is';
$a[] = 'a';
$a[] = 'a';
$a[] = 'test';
$a[] = 'test';
$a[] = 'array';
$excluded = array('is', 'a');
$result = array_diff($a, $excluded); // Remove all excluded words
$result = array_unique($result); // unique values
var_dump($result);
结果:
array (size=3)
0 => string 'This' (length=4)
5 => string 'test' (length=4)
7 => string 'array' (length=5)