2011-11-20 201 views
0

我想建立一個php類,它應該按照與輸入的搜索查詢「相似性」的順序對來自mysql數據庫的結果進行排序。我正在使用php函數similar_text。如何定義我的數組按特定順序排序的usort?

class compare { 

static $_base = NULL; 

static function setBase($base) { 
    if (!isset ($base) or !is_string($base)) { 
     $base = ""; 
    } 
    self::$_base = strtolower($base); 
} 

static function cmp($a) { 
    if (!is_string(self::$_base)){ 
     self::setBase(); 
    } 
    similar_text(self::$_base, strtolower($a), $a_pct); 
    return $a_pct; 
} 

static function eachcmp($src, $arr) 
{ 
    $ordered = array(); 
    foreach($arr as $key => $val) 
    { 
     $sim = cmp($val); 
     $ordered[]["something"] = $arr[$key]["something"]; 
     $ordered[]["something2"] = $arr[$key]["something2"]; 
     $ordered[]["sim"] = $sim; 
    } 
} 

}

正如你可以在函數「eachcmp」我比較基本數組中的每個值,然後所有的值寫入到一個新的數組看到。現在我的問題從這裏開始。我怎樣才能按照$ ordered [] [「sim」]的順序排列數組?我知道我可能需要使用usort,但我不知道哪個函數作爲usort的參數。

Thx求助! phpheini

回答

0

首先,我認爲你的函數應該是這樣的:

static function eachcmp($src, $arr) 
{ 
    $ordered = array(); 
    foreach($arr as $key => $val) 
    { 
     $sim = cmp($val); 
     $data = array(); 
     $data["something"] = $arr[$key]["something"]; 
     $data["something2"] = $arr[$key]["something2"]; 
     $data["sim"] = $sim; 
     $ordered[] = $data; 
    } 
} 

否則你會被創建$ordered數組中的新的數組元素。

現在爲usortusort需要一個數組和一個比較函數。在PHP> = 5.3中,您可以使用lambda函數。適合您需要的比較功能可能如下所示:

usort($ordered, function($a, $b) { 
    $al = intval($a["sim"]); 
    $bl = intval($a["sim"]); 
    if ($al == $bl) { 
     return 0; 
    } 
    return ($al > $bl) ? +1 : -1; 
}); 
+0

好的,謝謝!我現在創建了一個新的功能補償。 'function comp($ a,$ b){ \t $ al = intval($ a [「sim」]); \t $ bl = intval($ a [「sim」]); \t if($ al == $ bl){ \t \t return 0; \t} \t else return($ al> $ bl)? +1:-1; }' 我在函數eachcmp中調用該函數。所以我添加了'usort($ ordered,comp($ src,$ sim));'給每個cmp。但它給了我一個錯誤:usort()[function.usort]:無效的比較函數 – phpheini

+0

你需要給一個回調函數,你給的是一個函數結果。試試'usort($命令,「comp」)'。 – halfdan

+0

但是,這種方式,我不給功能$ a和$ b值。 – phpheini

相關問題