2012-08-04 49 views
0

可能重複:
How to sort the results of this code?如何訂購這個陣列從高到低?

我有此代碼,允許用戶輸入一個搜索欄的問題。然後,這段代碼將採取這個問題,並在數據庫中尋找有問題的單詞。然後計算每個問題的匹配詞數。一旦完成,然後顯示前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>"; 
      } 
?> 
+1

您應該使用純SQL或類似lucene的方法來做到這一點 – Ron 2012-08-04 07:48:36

+0

請不要使用'mysql_ *'函數,它們不再被維護,並且社區已經開始[deprecation process](http://goo.gl/ KJveJ)。相反,您應該瞭解[準備好的語句](http://goo.gl/vn8zQ)並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。如果你不能決定,[本文](http://goo.gl/3gqF9)將有助於選擇。如果你想學習,[這裏是一個很好的PDO相關教程](http://goo.gl/vFWnC)。 – vascowhite 2012-08-04 07:54:41

+0

您確定此代碼有效嗎?對我來說,while()永遠不會關閉。除此之外,我建議你使用比「$ newarray」和「$ thenewarray」更好的變量名稱。另外:你永遠不會將$ title_array聲明爲一個數組。 這就是說,我會扭轉顯示的數組。 – 2012-08-04 07:55:02

回答

0

我認爲你必須在數組排序的問題。

如果你有一個數組,排序不是問題。

在php中找到不同類型的排序。

arsort()

逆向排序數組,並保持索引關係

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

您可以使用此陣列功能還是讓我簡要地知道你的問題。

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 =陣列

( '鍵'=> '值', 'KEY2'=> '值');

你現在可以排序與

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

鍵2遞增,所以你可以把匹配的單詞總數爲您的數組作爲任何進入一個節點,並通過它降

+0

後期排序不如直接SQL查詢 – 2012-08-04 08:00:26

0

注過濾它這需要Mysql版本4+

A fulltext 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()函數。這些都清楚地記錄在案。

+0

但我怎麼把這個放到我的代碼中。 Iv試圖改變我的while循環,但它不起作用。我如何將其嵌入到我的代碼中或嵌入它的位置? – Ben 2012-08-04 08:18:30