2

説明するのは難しいですが、助けが必要です。つまり、4つの文字列、、、、 および $query = 'google awesome';が あり ます。$result1 = 'google is cool';$result1 = 'google is awesome';$result3 = 'other page';

PHPを使用したとしましょう。これはsimilar_text();$result160%類似しており、$result270%類似しており、$result35%類似しています。

最高から最低の順にエコーするにはどうすればよいですか。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. */
    }
}
4

4 に答える 4

1

PHPにはusort独自の比較関数を作成する機能があります。ドキュメントから直接:

<?php
$ref = "some ref string";

function cmp($a, $b)
{
    global $ref;
    return similar_text($ref, $a) - similar_text($ref, $b);
}

$a = array("one", "two", "three");

usort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}
?>

similar_text文字列ごとに複数回計算しているため、これは非常に非効率的である可能性があることに注意してください。

于 2013-03-10T17:48:51.667 に答える
1

すべての文字列を配列に格納し、 usort()などのユーザー定義の比較関数を使用することをお勧めします

于 2013-03-10T17:45:59.437 に答える
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);
于 2013-03-10T17:58:16.790 に答える
0

たとえば、配列を並べ替えて印刷するよりも、結果とテキストを使用して配列を作成できます。

 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;
    }
}

読むべきリンク:

http://www.php.net/manual/en/function.arsort.php

http://www.php.net/manual/en/function.each.php

http://www.php.net/manual/en/function.list.php

于 2013-03-10T17:51:32.843 に答える