Как определить usort для сортировки моего массива в определенном порядке? - PullRequest
0 голосов
/ 20 ноября 2011

Я пытаюсь создать класс php, который должен сортировать мои результаты, поступающие из базы данных mysql, в порядке их «сходства» с введенным поисковым запросом.Я использую функцию php Similar_text.

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", я сравниваю каждое значение в массиве с Base и затем записываюзначения в новый массив.Теперь моя проблема начинается здесь.Как я могу теперь упорядочить массив в порядке $ order [] ["sim"]?Я знаю, что мне, вероятно, нужно использовать usort, но я не знаю, какую функцию указать в качестве параметров для usort.

Спасибо за помощь!phpheini

1 Ответ

0 голосов
/ 20 ноября 2011

Прежде всего, я думаю, что ваша функция должна выглядеть следующим образом:

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.

Теперь для usort. usort ожидает массив и функцию сравнения. В PHP> = 5.3 вы можете использовать лямбда-функции для этого. Подходящая функция сравнения для ваших нужд может выглядеть так:

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