Сортировка мультиразмерного массива по баллам и имени пользователя - PullRequest
4 голосов
/ 10 июня 2019

У меня есть массив, в котором есть имена пользователей и оценки.

Сначала я сортирую по наибольшему количеству баллов Это работает просто отлично, но тем, у кого одинаковые баллы, я хочу, чтобы они были отсортированы по имени, а остальные, у которых 0, также должны быть отсортированы по имени.

Я использую эту функцию для сортировки по r_nb_today (это оценка):

function sortByNbToday($a, $b) {
    $a = $a['r_nb_today'];
    $b = $b['r_nb_today'];
    if ($a == $b) return 0;
    return ($a > $b) ? -1 : 1;
}
usort($disp_user_arr, 'sortByNbToday');

А вот и вывод массива:

Array
(
    [0] => Array
        (
            [u_id] => 9
            [u_name] => Souhaila S.
            [r_nb_today] => 7
        )

    [1] => Array
        (
            [u_id] => 59
            [u_name] => Cirine E.
            [r_nb_today] => 2
        )

    [2] => Array
        (
            [u_id] => 64
            [u_name] => Cyrine B.
            [r_nb_today] => 1
        )

    [3] => Array
        (
            [u_id] => 8
            [u_name] => Jihen B. R.
            [r_nb_today] => 1
        )

    [4] => Array
        (
            [u_id] => 18
            [u_name] => Otail J.
            [r_nb_today] => 0
        )

    [5] => Array
        (
            [u_id] => 15
            [u_name] => Rim H.
            [r_nb_today] => 0
        )

    [6] => Array
        (
            [u_id] => 12
            [u_name] => Bassem D.
            [r_nb_today] => 0
        )

    [7] => Array
        (
            [u_id] => 75
            [u_name] => Mariem N.
            [r_nb_today] => 0
        )

    [8] => Array
        (
            [u_id] => 66
            [u_name] => Khaoula K.
            [r_nb_today] => 0
        )

    [9] => Array
        (
            [u_id] => 74
            [u_name] => Ghada J.
            [r_nb_today] => 0
        )

    [10] => Array
        (
            [u_id] => 62
            [u_name] => Alaeddine M.
            [r_nb_today] => 0
        )

    [11] => Array
        (
            [u_id] => 79
            [u_name] => Khaled B.
            [r_nb_today] => 0
        )

    [12] => Array
        (
            [u_id] => 71
            [u_name] => Desiree Y.
            [r_nb_today] => 0
        )

Ответы [ 3 ]

2 голосов
/ 10 июня 2019

изменить код немного: -

function sortByNbToday($a, $b) {
    if ($a['r_nb_today'] == $b['r_nb_today']){ 
        return strcmp($a["u_name"], $b["u_name"]); // add string comparison code
    }
    return ($a['r_nb_today'] > $b['r_nb_today']) ? -1 : 1;
}
usort($disp_user_arr, 'sortByNbToday');

Выход: - https://3v4l.org/3XQBQ

2 голосов
/ 10 июня 2019

Вы можете использовать мультисортировку

$r_nb_today = array_column($arr, 'r_nb_today');
$u_name     = array_column($arr, 'u_name');
array_multisort($r_nb_today, SORT_NUMERIC, SORT_DESC,  
$u_name, SORT_NATURAL, SORT_ASC, $arr);

Если по имени вы хотите изменить направление, используйте sort_desc для $u_name.

Вот подробности о array_multisort .

Демо 1 & Демо 2 . Проверьте, какой выход вы хотите.

1 голос
/ 10 июня 2019
function sortByNbToday($a, $b) {
    $score1 = $a['r_nb_today'];
    $score2 = $b['r_nb_today'];
    if ($score1 != $score2){ 
     return -1 * ($score1 - $score2); 
    }
    return strcmp($a['u_name'],$b['u_name']);
}

Если обе оценки разные, вернуть их результат, иначе вернуть результат из u_name сравнения строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...