2011-11-20 54 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

相关问题