我有一个简单的非关联数组,有几千个值。
值是由1-10个单词组成的字符串。
我需要找到数组中有最多“命中”的3-4个连续的单词串。
这是字母数字,不区分大小写。
一个热门的可能是:
字符串中的任何单个单词都出现在数组的项中。任何多个连续单词的集合都出现在数组的一个项目内。
所以,举个例子:
$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来查找命中结果。我最终得到了一个巨大的矩阵,我无法从其中获得我需要的输出。
发布于 2013-03-02 07:56:01
我希望这就是你要找的。我确信有很多可以优化的地方,但我认为这将为您指明正确的方向。
哈哈,安迪
<?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";
}
?>https://stackoverflow.com/questions/15166784
复制相似问题