php - 数组值与字符串 PHP 的匹配

标签 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) 在 $array_10000 上使用 foreach 并在 $stringx 上使用 preg_replace

方法 1 大约需要 60 秒来遍历 200 行数据,方法 2 可以在 60 秒内循环 500 行。

有更好的方法吗?

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

非常感谢您的帮助。

最佳答案

以下只是备选方案。它可能会也可能不会满足您的要求。

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

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

$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);
}

另一个执行速度更快的示例(107ops/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);
}

关于php - 数组值与字符串 PHP 的匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5420765/

相关文章:

php - 如何从数组中获取随机值?

powershell - Powershell:将管道发送为命令的参数

php - 通用正则表达式代码

php - 使用以问号作为通配符的输入查找潜在的莫尔斯电码字符串匹配

php - 使用 PHP 编译 C++

php - 我在从 php 执行 MySQL 触发器时遇到问题

php - Contentful - 内容管理 API 的示例代码

java - 为什么在 foreach 循环中分配给迭代变量不会更改基础数据?

reactjs - 如何在 Reactjs 中一次调用上传多个图像文件

PHP preg_match "AND"运算符