【问题标题】:How to sort array by key value and preserve order of equal如何按键值对数组进行排序并保持相等的顺序
【发布时间】:2019-06-03 23:02:19
【问题描述】:

如何按键的值对数组进行排序并在值相等时保留顺序。

数组:

Array ( [0] => Array ( [id] => 65 [count] => 2 ) [1] => Array ( [id] => 67 [count] => 500 ) [2] => Array ( [id] => 61 [count] => 225 ) [3] => Array ( [id] => 58 [count] => 2 ) )

期望的输出:

Array ( [0] => Array ( [id] => 67 [count] => 500 ) [1] => Array ( [id] => 61 [count] => 225 ) [2] => Array ( [id] => 65 [count] => 2 ) [3] => Array ( [id] => 58 [count] => 2 ) )

我想按“计数”键从高到低排序。

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    我猜我们希望根据我们的两个键对数组进行双重排序。然后,我们将我们的数组定义为$arr,并在我们想要的键上定义array_multisort

    array_multisort(array_column($arr, 'count'), SORT_DESC, array_column($arr, 'id'), SORT_DESC, $arr); 
    

    如果我们只对count进行排序,我们将删除id

    array_multisort(array_column($arr, 'count'), SORT_DESC, $arr);
    

    测试 1

    $arr = [
        "0" =>
        [
            "id" => 65, "count" => 2,
        ],
        "1" =>
        [
            "id" => 67, "count" => 500,
        ],
        "2" =>
        [
            "id" => 61, "count" => 225,
        ],
        "3" =>
        [
            "id" => 58, "count" => 2,
        ],
    ];
    
    array_multisort(array_column($arr, 'count'), SORT_DESC, array_column($arr, 'id'), SORT_DESC, $arr);
    
    var_dump($arr);
    

    输出 1

    array(4) {
      [0]=>
      array(2) {
        ["id"]=>
        int(67)
        ["count"]=>
        int(500)
      }
      [1]=>
      array(2) {
        ["id"]=>
        int(61)
        ["count"]=>
        int(225)
      }
      [2]=>
      array(2) {
        ["id"]=>
        int(65)
        ["count"]=>
        int(2)
      }
      [3]=>
      array(2) {
        ["id"]=>
        int(58)
        ["count"]=>
        int(2)
      }
    }
    

    如果我们只想对 count 进行排序,这可能会起作用:

    测试 1

    $arr = [
        "0" =>
        [
            "id" => 65, "count" => 2,
        ],
        "1" =>
        [
            "id" => 67, "count" => 500,
        ],
        "2" =>
        [
            "id" => 61, "count" => 225,
        ],
        "3" =>
        [
            "id" => 58, "count" => 2,
        ],
    ];
    
    array_multisort(array_column($arr, 'count'), SORT_DESC, $arr);
    
    var_dump($arr);
    

    输出 2

      array(4) {
        [0]=>
        array(2) {
          ["id"]=>
          int(67)
          ["count"]=>
          int(500)
        }
        [1]=>
        array(2) {
          ["id"]=>
          int(61)
          ["count"]=>
          int(225)
        }
        [2]=>
        array(2) {
          ["id"]=>
          int(58)
          ["count"]=>
          int(2)
        }
        [3]=>
        array(2) {
          ["id"]=>
          int(65)
          ["count"]=>
          int(2)
        }
      }
    

    【讨论】:

    • 感谢回复,但如果值相等,仍然不尊重之前的数组顺序。
    • 问题是它在后台显示具有最大'id'的那些,有时它不尊重真正的数组顺序。
    【解决方案2】:

    您可以使用 usort 并在值相同时返回 0 以保持顺序:

    $arrays = [
        ["id" => -10,"count" => 2],
        ["id" => 10000,"count" => 2],
        ["id" => 1000,"count" => -1],
        ["id" => 1000,"count" => 2],
        ["id" => 65,"count" => 2],
        ["id" => 67,"count" => 500],
        ["id" => 61,"count" => 225],
        ["id" => 58,"count" => 2],
        ["id" => 59,"count" => 2]
    ];
    
    usort($arrays, function ($x, $y) {
        if ($x['count'] === $y['count']) {
            return 0;
        } elseif ($x['count'] > $y['count']) {
            return -1;
        } else {
            return 1;
        }
    });
    
    print_r($arrays);
    

    结果

    Array
    (
        [0] => Array
            (
                [id] => 67
                [count] => 500
            )
    
        [1] => Array
            (
                [id] => 61
                [count] => 225
            )
    
        [2] => Array
            (
                [id] => -10
                [count] => 2
            )
    
        [3] => Array
            (
                [id] => 10000
                [count] => 2
            )
    
        [4] => Array
            (
                [id] => 1000
                [count] => 2
            )
    
        [5] => Array
            (
                [id] => 65
                [count] => 2
            )
    
        [6] => Array
            (
                [id] => 58
                [count] => 2
            )
    
        [7] => Array
            (
                [id] => 59
                [count] => 2
            )
    
        [8] => Array
            (
                [id] => 1000
                [count] => -1
            )
    
    )
    

    查看php demo

    【讨论】:

    • 我不知道为什么,但它仍然没有根据数组对相等条目进行优先级排序。 ://
    • 你能分享它不起作用的示例数据以及预期什么?
    • 无排序:link,后:link。最高值的最大“计数”值为“2”,其他为“1”。
    • @Alex 从这些图像中我无法确定是否不正确。您能否确认我的答案中的数据排序是否正确? Demo 仅使用 1 和 2
    • 你确定只有 2 和 1 还是中间有字符串?您是否可能在之后操纵数据?如果解决方案有效,那么我认为问题可能出在其他地方。
    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多