$a[] = "paris";
$a[] = "london";
$a[] = "paris";
$a[] = "london tour";
$a[] = "london tours";
$a[] = "london";
$a[] = "londonn";
foreach($a as $name) {
echo $name;
echo '<br>';
}输出:
paris
london
paris
london tour
london tours
london
londonn我可以用array_unique删除相同的单词。
foreach(array_unique($a) as $name) {
echo $name;
echo '<br>';
}输出:
paris
london
london tour
london tours
londonn我想更进一步,去掉类似的字眼。比如,如果有一个“伦敦”,我想消除“伦敦”。
因此,输出将是:
paris
london
london tour我尝试了similar_text($name,$name,$percent),但是没有帮助。
以下是我用有限的知识所做的尝试:
foreach(array_unique($a) as $name) {
$test = $a;
foreach($test as $test1) {
similar_text($name, $test1, $percent);
if ($percent > 90) {
echo $name;
echo '<br>';
}
}
}输出:
paris
paris
london
london
london
london tour
london tour
london tours
london tours
londonn
londonn
londonn这些词的来源是一个搜索列表:
$a[] = "$popular_search";
发布于 2022-09-20 14:30:03
主要问题似乎是使用这两个嵌套循环的方式。这里有一个非常显式的例子,没有任何花哨的东西,展示了如何做到这一点:
$a[] = "paris";
$a[] = "london";
$a[] = "paris";
$a[] = "london tour";
$a[] = "london tours";
$a[] = "london";
$a[] = "londonn";
$b = [];
foreach($a as $outerName) {
// start optimistic, no similar string found
$isUnique = true;
foreach($b as $innerName) {
// check whether the string already has a similar entry
similar_text($outerName, $innerName, $percent);
if ($percent > 90) {
$isUnique = false;
break;
}
}
if ($isUnique) {
$b[] = $outerName;
}
}
print_r($b);产出如下:
Array
(
[0] => paris
[1] => london
[2] => london tour
)它怎麽工作?有一个外部循环,它简单地遍历数组$a中的所有字符串。在该循环中,它循环遍历已经被标识为足够唯一的字符串$b。如果来自$a的字符串与$b字符串非常相似,那么我们跳过它。就这样。
发布于 2022-09-20 14:11:57
您可以使用函数返回的%%部分.这将返回两个输入之间的相似性百分比。
对于我实现的一个单词游戏,我使用了这种方法,并且对我来说“匹配”这个单词,测试>= 60到80的百分比似乎适用于“大多数”我的测试用例,这取决于您希望它是多么的挑剔!
就我的情况而言,为了使它准确,我首先将测试词转换为隐喻:
public static function testMetaphone($s1 = "", $s2 = "", $phonemes = 4)
{
if (empty($s1) || empty($s2)) {
return false;
}
$m1 = metaphone($s1, $phonemes);
$m2 = metaphone($s2, $phonemes);
$sim = similar_text($m1, $m2, $perc);
$logMessage = "M1: {$m1}, M2: {$m2}, Similarity: $sim ($perc %) - Originals text: {$s1} | {$s2}";
Log::info("testMetaphone: " . $logMessage);
// Test accuracy
if ($perc >= 85) {
return true;
} else {
return false;
}
}用法:
$answerCheck = testMetaphone("Toyota", "Totota", 6);看到它的作用:https://3v4l.org/KceXD -上面的失败,如果%-年龄是85%,但通过如果%60。所以,再一次,可能需要玩这个,以找到你满意的地方,它的准确性。
对于您的情况,您可以循环数组,并使用此函数将每个元素与每个其他元素进行比较,并跟踪每个单词的选中情况,以及有多少相似的条目,然后相应地删除“重复项”。
https://stackoverflow.com/questions/73788025
复制相似问题