将数组的值与字符串PHP匹配

时间:2011-03-24 14:32:45

标签: php foreach preg-match string-matching array-difference

我正在开展一个小项目,我需要一些帮助。我有一个包含150,000行的CSV文件(每行有10列数据)。我正在使用fscvread来读取文件,并且在循环期间我希望将每行的一个列(称为stringx)与10,000个单词的数组进行匹配。如果stringx中存在10,000个单词中的任何一个,则使用preg_replace删除它。

现在所有这一切都很好。我的一切工作正常,但问题是,它太慢了。

我尝试了两种匹配数组的方法。 1)我使用explode(“”,$ stringx)将stringx转换为数组,然后使用array_diff($ array_stringx,$ array_10000); 2)在$ arrayx100上使用foreach,在$ stringx上使用preg_replace

方法1需要大约60秒才能完成200行数据,方法2可以在60秒内循环500行。

有更好的方法吗?

再次,我正在寻找一种有效的方法(基本上)array_diff一个10,000字的数组,一次一个150,000字符串。

非常感谢帮助。

6 个答案:

答案 0 :(得分:2)

以下只是另一种选择。它可能会也可能不会满足您的要求。

它在我的笔记本电脑上执行84次操作/秒,10k字词典和15k字符串。

缺点是它不会删除单词周围的空格。

$ wordlist只是每行一个字的行,可以是文件。

$dict = array_flip(preg_split('/\n/',$wordlist));

function filter($str,$dict) {
  $words = preg_split('/\s/',$str);
  sort($words);
  $words = array_unique($words);

  foreach ($words as $word) {
    if (key_exists($word,$dict)) {
        $removeWords[] = '/\b' . $word . '\b/';
    }
  }
  return preg_replace($removeWords, '', $str);
}

另一个执行速度更快的例子(107k / s,15kb字符串和10k字字典)

function filter2($str,$dict) {
  $words = preg_split('/\b/',$str);
  foreach ($words as $k => $word) {
    if (key_exists($word,$dict)) {
        unset($words[$k]);
    }
  }
  return implode('', $words);
}

答案 1 :(得分:1)

您的10000字数组是否排序?如果没有,请先尝试排序。

编辑:好吧,因为它的排序我猜测也许PHP的array_search不进行二进制搜索,所以我会寻找二进制搜索实现并使用它。如果它确实只是一个线性搜索,那么你将获得一个数量级的速度增加。

答案 2 :(得分:1)

PHP不是速度的语言,但我猜你知道。我必须在我正在编写的项目中做类似的事情,我正在用PHP编写一个文件,然后使用Matlab独立来读取该文件,处理它并输出另一个文件。

您也可以这样做并在C中编写一个与array_diff()相同的小程序。我认为虽然我没有做过任何测试,但会有很大的不同。

答案 3 :(得分:1)

如何不爆炸stringx,并为$ array_10000中的每个单词执行stripos()

像这样:

foreach ($array_10000 as $word)
{
    if (stripos($stringx, $word) !== false)
    {
        // do your stuff
    }
}

答案 4 :(得分:0)

我没有对此进行测试,但它只是发生在我身上:

您可以尝试使用正则表达式预解析文件以获取要过滤的150,000个单词(基于列分隔符),然后您可以执行文本替换,根据this article I googled选择最佳函数。 / p>

我希望它有所帮助!干杯!

答案 5 :(得分:0)

您可以执行foreach以及implode

$words = array("one","two", "three");
$number = 0;
foreach ($words as $false_array)
{
$number += 1;
$array[$number] = $false_array;
echo "Added ". $false_array . ". ";
}
foreach ($words as $false_array)
{
echo "Array Contains " . $false_array . ". ";
}

如果您要在php中执行此操作,您将获得:

Added one. Added two. Added three. Array Contains one. Array Contains two. Array Contains three.