【问题标题】:Don't echo string if before string is similar to current string如果之前的字符串与当前字符串相似,则不要回显字符串
【发布时间】:2012-02-04 13:17:39
【问题描述】:

如果之前的字符串与当前字符串相似,我不想回显字符串。假设我们的字符串是,

$strings = array("software","software","game","antivirus");

我的差异函数,

function ($val1,$val2) {
similar_text($val1,$val2,$percent);
if ($percent>83) {
// should not echo. But don't know how to do.
}
}

但我不知道我该怎么做。我想应该是使用 for each。

【问题讨论】:

  • $percentsimilar_text() 来自哪里?但是,如果您不想回显超过 83%,那么只需将其更改为 $percent<=83
  • @lethalMango $percent 由 php 的similar_text() 函数自动生成。在对主题进行评级之前,请确保修改您的学者对情况的了解。
  • 所以我问了一个问题以了解您的问题,以供我参考。如果我知道答案,我会自己回答。在假设我对主题进行了评分之前,请确保您知道谁对它们进行了评分。

标签: php arrays function foreach


【解决方案1】:

试试这样的:

$strings = array("software","software","game","antivirus");

$lastString = '';

foreach ($strings as $string) {
    similar_text($lastString, $string, $percent);
    if ($percent < 83) {
        echo "$string<br />";
        $lastString = $string;
    }
}

如果你不明白其中的某些部分,请发表评论,我会澄清。

编辑:
我在条件中移动了$lastString = $string;

考虑以下字符串列表:
$strings = array("software","sofware","sofwart","ofwart","fwart","wart","warts");

$lastString 赋值留在循环之外只会打印software,即使很多单词与software 非常不同,它们与前一个单词并没有太大区别。

将它移到里面实际上给出了输出:

软件
软件

【讨论】:

  • 是的,实际上这些字符串只是一个示例。我将在句子中使用它。
【解决方案2】:
$strings = array("software","software","game","antivirus");
$previous = '';
foreach ($strings as $string) {
  if ($string===$previous) {
    continue;
  } else {
    echo $string;
    $previous = $string;
  }
}

但我认为这样做更好(应该更快):

$strings = array("software","software","game","antivirus");
$num = count($strings);
for ($i=0;$i<$num;$i++) {
  if ($strings[$i]===$strings[$i-1] && $i!==0) {
    continue;
  } else {
    echo $strings[$i];
  }
}

顺便说一句,我完全不明白 $percent 的含义..

【讨论】:

  • 为什么if(cond) { continue; } 可以做到if (!cond)。此外,您只满足不符合要求的完全匹配。
  • @madxpol $percent 是 php 的similar_text() 函数生成的相似度百分比。
【解决方案3】:

使用array_filter() 的方法(假设 >= 5.3):

$strings = array('software', 'software', 'game', 'antivirus');

$filtered = array_filter($strings, function($curr) {

    static $prev; 

    similar_text($prev, $curr, $percent);
    $prev = $curr;   

    if ($percent < 83) {
        return $curr;
    }        
});

print_r($filtered);

产量:

Array
(
    [0] => software
    [2] => game
    [3] => antivirus
)

希望这会有所帮助。实际上,直到现在我才知道similar_text()。很有趣的功能。谢谢:)

【讨论】:

  • 谢谢达拉格。 Leigh 的剧本对我来说效果很好。但我也会试试你的。如果可行,我将测试并使用最快的。
  • 哈哈。是的,我刚看到 Leigh 在我发帖时被标记为已回答!实际上,一些 array_* 函数足够慢,所以我敢打赌他会更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 2015-01-13
  • 2021-01-31
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多