PHP使用array_filter

时间:2014-04-10 08:30:02

标签: php arrays

我会尽力解释我的情况,所以请耐心等待。

我有一个包含单个单词的数组,例如:

This is a test array

现在我创建了另一个看起来相似但有2个单词的数组,如下所示:

This is is a a test test array

好的,这是我的问题开始的地方。我有一系列“常用词”,这些词应该从数组中排除。假设这个例子的常用词是isa。现在我首先在单个单词数组上搜索常用单词,这样我就可以使用if(in_array($word, $common_words)) continue;如果它在common_words数组中,它会跳过它。

但这会产生这个数组:

This test test array

但这不是我希望它发生的方式。它应该是这样的:

test array

因为在我们开始取出'common_words'之前,这是唯一一个在彼此旁边有这两个单词的人。 (你还和我在一起吗?)

这里的问题是如果我有一个包含2个单词的数组,if(in_array)就不再起作用了。所以我做了一些研究,偶然发现了array_filter命令。我认为这是我需要的,但我完全不知道如何使用/应用它到我的代码。

我希望我能够很好地解释你的问题,如果有人可以帮助我,我会很感激。

提前致谢!

2 个答案:

答案 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)