Php 从最高相似性到最低相似性的回显字符串
很难解释,但我需要一些帮助。 所以我有,比如说4根弦Php 从最高相似性到最低相似性的回显字符串,php,foreach,Php,Foreach,很难解释,但我需要一些帮助。 所以我有,比如说4根弦 $query='googleawesome',, $result1='谷歌很酷',, $result1='谷歌太棒了',以及 $result3='other page' 假设我使用了PHP的similor_text()和$result1相似性为60%,$result2相似性为70%,而$result3相似性为5% 我如何按从高到低的顺序回应它们。注意,我使用了3个以上的字符串,我只是使用foreach()来回显结果 编辑:这是我的一段代码 i
$query='googleawesome'代码>,,
$result1='谷歌很酷'代码>,,
$result1='谷歌太棒了'代码>,以及
$result3='other page'代码>
假设我使用了PHP的similor_text()代码>和$result1
相似性为60%,$result2
相似性为70%,而$result3
相似性为5%
我如何按从高到低的顺序回应它们。注意,我使用了3个以上的字符串,我只是使用foreach()来回显结果代码>
编辑:这是我的一段代码
if(isset($_GET['q'])) {
$results = file(__DIR__ . '/data/urls.txt');
$query = $_GET['q'];
foreach($results as $result) {
$explode = explode('::', $result);
$site = $explode[0];
$title = $explode[1];
/* if $query = similar to $title, echo ordered by similarity. */
}
}
我建议您将所有字符串存储在一个数组中,并使用用户定义的比较函数,如PHP的usort
函数来创建您自己的比较函数。直截了当地说:
请注意,这可能是非常低效的,因为您对每个字符串不止一次地计算相似的文本。例如,您可以使用结果和文本构建一个数组,而不是对数组排序并打印
if(isset($_GET['q'])) {
$results = explode("\n",file_get_contents(__DIR__ . '/data/urls.txt')); // i assume all url is in a new line
$query = $_GET['q'];
$similarity = array();
$map = array();
foreach($results as $result) {
list($site,$title) = explode('::', $result);
$similarity[$site] = similar_text($title,$query); //calculate similari by title for sites 0 is similar bigger is not realy similar
$map[$site] = $title;
}
asort($similarity,SORT_NUMERIC); //sort the results
$limit = 10;
foreach($similarity as $site=>$sim){
print "<a href='{$site}'>{$map[$site]}</a>({$sim} % differnece what you need)<br/>";
if( --$limit < 1) break;
}
}
if(isset($\u GET['q'])){
$results=explode(“\n”,file_get_contents(uuu DIR_uu.'./data/url.txt”);//我假设所有url都在新行中
$query=$\u GET['q'];
$similarity=array();
$map=array();
foreach($results作为$result){
列表($site,$title)=分解(“::”,$result);
$similarity[$site]=similari_text($title,$query);//根据站点0的标题计算similari是相似的更大的不是真正的相似
$map[$site]=$title;
}
asort($similarity,SORT_NUMERIC);//对结果进行排序
$limit=10;
foreach($site=>$sim){
打印“({$sim}%不同于您需要的内容)
”;
如果(-$limit<1)中断;
}
}
应阅读的链接:
此解决方案将允许具有相同相似性排名的$results不会相互覆盖。他们被列为先到先得
$query = 'google awesome';
$results = array('google is cool', 'google is awesome','other page');
foreach ($results as $result) {
$rank = similar_text($query,$result);
$rankings[$rank][] = $result;
}
krsort($rankings);
“从最高到最低的相似性”以哪个字符串作为参考点?到变量$query
。更新了代码,我知道它看起来不好,但我不能使用数据库,哈哈。顺便说一下,文件的内容是http://url.com/::Title
我会进一步预计算类似的文本
,以避免不必要地重新计算。我非常困惑。即将更新我的问题,请重新阅读。似乎不起作用<代码>https://v1k.org/search/?q=vlad1k
我的名字添加了几个结果。还是没什么。我的URL文件-它运行良好,但它最后显示了最具代表性的搜索。你如何扭转这种局面?好的,非常感谢。最后一个问题:如何将结果限制为10?没有页面,只有结果。没有数组,还有什么方法可以做到这一点吗?你有什么理由不能使用数组吗?这对我来说似乎有点难。idk为什么。那么我建议你学习如何使用数组,它们在做事情时非常方便!你可以不用数组,但它会涉及很多循环和条件以及更多的代码。我的意思是,你所要做的就是按照你想要的顺序获得排名,只需复制/粘贴这些代码。在那之后,你想做什么,只需回显结果或其他什么?+1基本上是正确答案,但是,对于适当的排序,您确实希望-1
(或任何负数)返回,否则它会假定一些是相等的,而另一些是不相等的<代码>返回相似的\u文本($ref,$a)-相似的\u文本($ref,$b)代码>会更好。
$query = 'google awesome';
$results = array('google is cool', 'google is awesome','other page');
foreach ($results as $result) {
$rank = similar_text($query,$result);
$rankings[$rank][] = $result;
}
krsort($rankings);