0

可能重复:
如何对这段代码的结果进行排序?

我制作了这段代码,允许用户在搜索栏中输入问题。然后,此代码接受该问题并在我的数据库中查找带有问题的单词。然后它计算每个问题的匹配单词数。完成后,它会根据匹配的单词数显示前 4 个最匹配的问题。然而,目前它显示了从最低单词匹配到最高单词匹配(从低到高)的这些匹配,而我是相反的,因此它首先显示最佳匹配(从高到低)。我如何在这段代码中做到这一点?

    <?php
        include("config.php");
        $search_term = filter_var($_GET["s"], FILTER_SANITIZE_STRING); //User enetered data
        $search_term = str_replace ("?", "", $search_term); //remove any question marks from string

        $array = explode(" ", $search_term); //Seperate user enterd data

        foreach ($array as $key=>$word) {
        $array[$key] = " title LIKE '%".$word."%' "; //creates condition for MySQL query
        }

        $q = "SELECT * FROM posts WHERE  " . implode(' OR ', $array); //Query to select data with word matches
        $r = mysql_query($q);
        $count = 0; //counter to limit results shown
            while($row = mysql_fetch_assoc($r)){
            $thetitle = $row['title']; //result from query
            $thetitle = str_replace ("?", "", $thetitle);  //remove any question marks from string
            $title_array[] = $thetitle;  //creating array for query results
            $newarray = explode(" ", $search_term); //Seperate user enterd data again

            foreach($title_array as $key => $value) {
               $thenewarray = explode(" ", $value); //Seperate each result from query
               $wordmatch = array_diff_key($thenewarray, array_flip($newarray));
               $result = array_intersect($newarray, $wordmatch);
               $matchingwords = count($result); //Count the number of matching words from user entered data and the database query
            }
        if(mysql_num_rows($r)==0)//no result found{
            echo "<div id='search-status'>No result found!</div>";
        }
        else //result found
        {
        echo "<ul>";

        $title = $row['title'];
        if ($matchingwords >= 4){
        ?>
<li><a href='<?php echo $row['url']; ?>'><?php echo $title ?><i> &nbsp; No. matching words: <?php echo $matchingwords; ?></i></a></li>
<?php
                $count++;
                if ($count == 5) {break;
                }
                    }else{
                    }
                }
            echo "</ul>";
            }
?>
4

4 回答 4

0

我认为您在对数组进行排序时遇到问题。

如果你有一个数组,排序不是问题。

在 php.ini 中找到不同类型的排序。

排序()

对数组进行倒序排序并保持索引关联

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

您可以使用此数组功能或让我简要了解您的问题。

于 2012-08-04T07:52:42.387 回答
0

您可以编写自己的过滤器功能

// sorts an array by direction
function arr_sort($arr, $index, $direction='asc')
{
    $i_tab = array();
    foreach ($arr as $key => $ele)
    {
        $i_tab[$key] = $arr[$key][$index];
    }
    $sort = 'asort';
    if (strtolower($direction) == 'desc')
    {
        $sort = 'arsort';
    }
    $sort($i_tab);
    $n_ar = array();
    foreach ($i_tab as $key => $ele)
    {
          array_push($n_ar, $arr[$key]);
    }
    return($n_ar);
}

例如你有一个数组 $arr = array('key' => 'value', 'key2' => 'value');

您现在可以使用 key2 asc 排序

$arr = arr_sort($old_arr, 'key2', 'desc');

因此您可以将匹配单词的总数作为任何条目的节点放入数组中,并按降序过滤它

于 2012-08-04T07:55:36.820 回答
0

请注意,这需要 Mysql 版本 4+

全文sql 查询根据相关性返回值。

例子:

SELECT *, MATCH (title)
AGAINST ('$search_term' IN NATURAL LANGUAGE MODE) AS score
FROM posts;

这就是你将如何实现它

$q = "SELECT *,MATCH (title) AGAINST ('$search_term' IN BOOLEAN MODE) AS relevancy FROM
posts WHERE MATCH (title) AGAINST ('$search_term' IN BOOLEAN MODE) ORDER BY
relevancy DESC";

这将按相关性按顺序返回帖子。可能需要删除 $search_term 周围的 '' 但您可以通过测试来解决这个问题。

请阅读全文 sql 查询和 match() 函数。这一切都清楚地记录在案。

于 2012-08-04T08:10:30.877 回答
0

如果您已将数据保存在数组中,则可以使用http://www.php.net/manual/en/function.array-reverse.php简单地反转它

否则有一些排序功能 http://php.net/manual/en/function.sort.php

于 2012-08-04T07:50:10.720 回答