0

数千の値を持つ単純な非連想配列があります。
値は1〜10語の文字列です。

配列内で最も「ヒット」が多い3〜4個の連続する単語文字列を見つける必要があります。

これは英数字であり、大文字と小文字は区別されません。

ヒットは次のようになります。

文字列の任意の1つの単語は、配列の項目内にあります。複数の連続する単語のセットは、配列の項目内で発生します。

だから、例:

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

「犬のささやき」という3つの単語の文字列は、次のヒットを取得します。

「犬のささやき」の「犬のささやき」

「犬のささやき」の「犬のささやき」

「犬のささやき」の「犬」

「犬のささやき」の「the」

「犬のささやき」の「犬」

「犬のささやき」のささやき

「私はささやきです」の「ささやき」

「犬はしばしば毛深い」の「犬」

「犬」の「犬」

「あなたは犬のささやきですか」の「犬のささやき」

「あなたは犬のささやきですか」の「犬」

「あなたは犬のささやきですか」の「ささやき」

「犬はささやき声で操作できる」の「犬」

「犬はささやき声で操作できる」の「ささやき声」

複数の単語の文字列がヒットするためには、単語が連続している必要があります。つまり、「犬のささやき」は「犬はささやき声で操作できます」のヒットではありません。

言葉も整然としている必要があります。つまり、「dogs whisperer」は、「whispererdogs」という値のヒットではありません。

さまざまな配列関数をよく理解していますが、すべてをまとめることはできません。単語ごとに展開して再結合し、strpos!== FALSEを使用してヒットを探すことにより、可能なすべての文字列セットを抽出しようとしました。必要な出力を取得できない巨大な行列になってしまいます。

4

1 に答える 1

0

これがあなたが探しているものであることを願っています。最適化できるものはたくさんあると思いますが、これは正しい方向を示すと思います。

HTH、アンディ

<?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"; 
  }
?>
于 2013-03-01T23:56:01.260 に答える