首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标事件

目标事件
EN

Stack Overflow用户
提问于 2013-03-02 04:58:53
回答 1查看 51关注 0票数 0

我有一个简单的非关联数组,有几千个值。

值是由1-10个单词组成的字符串。

我需要找到数组中有最多“命中”的3-4个连续的单词串。

这是字母数字,不区分大小写。

一个热门的可能是:

字符串中的任何单个单词都出现在数组的项中。任何多个连续单词的集合都出现在数组的一个项目内。

所以,举个例子:

代码语言:javascript
复制
$database = array(
  0 => 'the dogs whisperer',
  1 => 'I am a whisperer',
  2 => 'dogs are often hairy',
  3 => 'dogs',
  4 => 'are you a dogs whisperer'
  5 => 'dogs can be manipulated by a whisperer');

三个单词的字符串“狗的耳语”会得到如下的点击率:

“狗语者”中的“狗语者”

“狗语者”中的“狗语者”

“狗语者”中的“狗”

“狗语者”中的那个“

“狗语者”中的“狗”

“狗语者”中的语者

“我是一个耳语者”中的“语者”

“狗常常有毛”中的“狗”

“狗”中的“狗”

“狗语者”中的“你是狗语者吗”

“你是狗语者吗”中的“狗”

“狗语者”中的“语者”

“狗可以被窃窃私语者操纵”中的“狗”

“狗可以被语者操纵”中的“语者”

为了使多个单词字符串获得匹配,这些单词必须是连续的。也就是说,“狗语者”不是“狗可以被语者操纵”的热门话题。

单词也必须是有序的。也就是说,“狗语者”在“语者狗”的值中不是一个热门。

我很好地掌握了不同的数组函数,但我就是不能把它们放在一起。我尝试过通过按单词分解和重新组合来提取所有可能的字符串集,然后使用strpos!==FALSE来查找命中结果。我最终得到了一个巨大的矩阵,我无法从其中获得我需要的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-02 07:56:01

我希望这就是你要找的。我确信有很多可以优化的地方,但我认为这将为您指明正确的方向。

哈哈,安迪

代码语言:javascript
复制
<?php
  $database = array(
  0 => 'the dogs whisperer',
  1 => 'I am a whisperer',
  2 => 'dogs are often hairy',
  3 => 'dogs',
  4 => 'are you a dogs whisperer',
  5 => 'dogs can be manipulated by a whisperer');

  function CreateSubsets($sstr)
  {
    $subsets = array();

    $tokens = explode(" ", $sstr);
    $count = count($tokens);

    for ($i = $count; $i > 0; $i--) 
    {
      for ($j = 0; $j + $i <= $count; $j++)
      {
        $subsets[] = implode(" ", array_slice($tokens, $j, $i));
      }      
    } 

    return $subsets;   
  }

  function SearchOccurrences($database, $subsets)
  {
    $resultAry = array();

    for ($subIdx = 0; $subIdx < count($subsets); $subIdx++) 
    {
      $occurrences = array();
      for ($idx = 0; $idx < count($database); $idx++) 
      {
        $dbval = $database[$idx];

        $pos = strpos($dbval, $subsets[$subIdx]);
        if ($pos !== false)
          $occurrences[] = $idx;

      }
      $resultAry[$subIdx] = $occurrences;   
    }

    return $resultAry;
  }

  header("Content-type: text/plain");

  print "Database:\n";
  print_r($database); 
  print "\n"; 

  $sstr = "the dogs whisperer";
  $subsets = CreateSubsets($sstr);  

  print "Subsets:\n";
  print_r($subsets);
  print "\n"; 

  $results = SearchOccurrences($database, $subsets);

  print "Results:\n";
  print_r($results);    
  print "\n"; 

  for ($i = 0; $i < count($subsets); $i++) 
  {
    print "'$subsets[$i]' was found in:\n";
    foreach ($results[$i] as &$resVal) 
    {
      print "  --> $database[$resVal]\n";      
    } 
    print "\n"; 
  }
?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15166784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档