【问题标题】:Sorting a Multidimisional Array by Both Score and User Name按分数和用户名对多维数组进行排序
【发布时间】:2019-06-10 11:40:21
【问题描述】:

我有一个包含用户名和分数的数组。

我先按最高分排序。它工作得很好,但是分数相同的我希望他们按名称排序,其余为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
        )

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    稍微修改一下代码:-

    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】:

      你可以使用多重排序

      $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的详细信息。

      Demo 1 & Demo 2。检查你想要的输出。

      【讨论】:

        【解决方案3】:
        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 字符串比较的结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-28
          • 2016-10-31
          相关资源
          最近更新 更多