在PHP中从多个类别数组中搜索子字符串


searching for sub strings from multiple category arrays in PHP

我有一段文字,大约1500字长。我必须在这篇文章中搜索某些单词的出现情况,并按类别对它们进行分组。例如,如果找到以下任何一个单词:"dalmation","boxer","terrier",则回叫"Canines",如果找到"lion","leopard","cheeta",则回叫"Felines",以此类推。在其他单词中找到的单词也是可以接受的,例如,"foxterrier"。

我目前使用以下命令来遍历字符串:

$arrTitle = explode(" ", "Loren ipsum dolor ...............");
// For dogs:
foreach( $arrTitle as $key => $value){
    echo "Name: $key, Value: $value <br />";
    $words = array("dalmation", "boxer", "terrier");
    foreach($words as $word){
        if (stripos($value, $word) !== false) {
            echo "Canines Exists";
        }
    }
}
//For cats:
foreach( $arrTitle as $key => $value){
    echo "Name: $key, Value: $value <br />";
    $words = array("lion", "leopard", "cheeta");
    foreach($words as $word){
        if (stripos($value, $word) !== false) {
            echo "Felines Exists";
        }
    }
}
// ...Repeat the above for all categories.

这个过程需要很长时间,而且我也不确定这是最有效的做事方式。请问谁能帮我找到一个更快的方法来做这件事?非常感谢您的帮助。

你在我的地盘上!

到目前为止,最快的方法是到array_flip,然后用isset来检查这个词是否存在,我花了很长时间才弄清楚。对于数以百万计的单词来说,这几乎是即时的(在字符串或数组中搜索的速度永远赶不上这个速度),但在这种情况下,它可能会耗尽RAM。

你应该先降低你的$words

$arrTitle = strtolower($arrTitle);
$arrTitle = explode(' ', $arrTitle);
$words=array('dalmation', 'boxer', 'terrier');
$words=array_flip($words);
foreach($arrTitle as $key => $value)
    {
    echo "Name: $key, Value: $value <br />";
    if (isset($words[$value])) echo $value.' Exists <br/>';
    }

您可以组合相似单词的regexp,然后对每个单词进行单个搜索。regexp并不是非常快,但它们比在PHP中运行自己的循环要快。: -)

$groups = array(
  'Canines' => array("dalmation", "boxer", "terrier"),
  'Felines' => array("lion", "leopard", "cheeta")
);
foreach ($groups as $group => $members) {
  $pattern = "/" . implode("|", $members) . "/i";
  if (preg_match($pattern, $src)) {
    print $group;
  }
}

元代码。我还没有测试过。

这里的想法是从代码中删除实际的组。毕竟,您的数据可以从数据库或其他来源加载;数据结构和数据应该分开。

通过如上所述使用数组,您可以添加新的组,而无需更改比较代码的主体。即。"Fish"应该是一个组,而不是一个代码块。

作为当前脚本的优化,您应该在同一循环中检查所有单词,而不是在$arrTitle上多次运行foreach。或者作为一种替代方法,在整个文档中为每个单词使用条带。

如果这是一个实际的生产站点,需要反复运行,我不会在PHP中这样做。一个数据库(MySQL或Solr)在你的文档上有一个适当的索引将产生更快的结果。