вторая сортировка с помощью php usort

Итак, у меня есть довольно большой массив данных, и мне нужно отсортировать их по двум критериям.

Есть переменные $data['important'] и $data['basic'].

Это простые числа, и я использую uasort для сортировки $data сначала по важному, а затем по основному.

So

Important | Basic
10        | 8
9         | 9
9         | 7
7         | 9

Функция usort является простой

public function sort_by_important($a, $b) {

        if ($a[important] > $b[important]) {
            return -1;
        } 
        elseif ($b[important] > $a[important]) {
            return 1;
        } 
        else {
            return 0;
        }
    }

Как я могу пересортировать массив по второй переменной и сохранить важный порядок?

Всем спасибо.

ИЗМЕНИТЬ

Как насчет добавления третьего варианта сортировки после этого? Так Важно > Базовый > Меньше


person bluedaniel    schedule 20.05.2010    source источник


Ответы (2)


Вы действительно должны использовать array_multisort(),

// Obtain a list of columns
foreach ($data as $key => $row) {
    $important[$key]  = $row['important'];
    $basic[$key] = $row['basic'];
}

array_multisort($important, SORT_NUMERIC, SORT_DESC,
                $basic, SORT_NUMERIC, SORT_DESC,
                $data);

но если вы должны использовать usort():

public function sort_by_important($a, $b) {

    if ($a[important] > $b[important]) {
        return -1;
    } elseif ($b[important] > $a[important]) {
        return 1;
    } else {
        if ($a[basic] > $b[basic]) {
            return -1;
        } elseif ($b[basic] > $a[basic]) {
            return 1;
        } else {
            return 0;
        }
    }
}
person kennytm    schedule 20.05.2010

Почему бы просто не использовать array_multisort()

public function sort_by_important($a, $b) { 
    if ($a['Important'] > $b['Important']) { 
        return -1; 
    } elseif ($b['Important'] > $a['Important']) { 
        return 1; 
    } else { 
        if ($a['Basic'] > $b['Basic']) { 
            return -1; 
        } elseif ($b['Basic'] > $a['Basic']) { 
            return 1; 
        } else { 
            return 0; 
        }
    } 
} 
person Mark Baker    schedule 20.05.2010
comment
array_multisort был правильным ответом, я должен был дать очки Кенни, потому что он дал мне ответ на месте, размещение порядка в отдельных переменных было немного, что меня смутило. Спасибо за вашу помощь! - person bluedaniel; 20.05.2010