对数组使用 collect ()->sortByDesc ()->sortByDesc ()

$last_datas['data'] = isset($last_data['data']) ? collect($last_data['data'])->sortByDesc('send_amount')->sortByDesc('date')->values()->all()

改代码只对数组的数据进行了按照date排序,没有按照send_amount排序,不太明白为什么
要想先对数组按照date排序,相同的date情况按照send_amount应该怎么写

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
Epona
最佳答案

collection 里的 sortBy 不会有 SQL里的那种效果的。 可以试试 array_multi_sort 这种方法(很蛋疼的一种方法😂

4年前 评论
讨论数量: 7
$sorted = $collection->sortBy(function ($row, $key) {
    return $row['send_amount'].$row['date'];
});

2019-8-15

测试有效

        $list = [
            [
                'date' => '2019-08-15',
                'amount' => 100,
            ],
            [
                'date' => '2019-08-15',
                'amount' => 110,
            ],
            [
                'date' => '2019-08-16',
                'amount' => 100,
            ],
            [
                'date' => '2019-08-16',
                'amount' => 110,
            ],
            [
                'date' => '2019-08-17',
                'amount' => 100,
            ],
            [
                'date' => '2019-08-17',
                'amount' => 110,
            ],
        ];
        $sort_list = collect($list)->sortBy(function ($row, $key) {
            // 主 amount 辅 date
            return $row['amount'].strtotime($row['date']);
            // 主 date 辅 amount
            // 假设 amount 最大位数为3
            // return strtotime($row['date']).sprintf('%-03s', $row['amount']);
            // 如果 amount 和 date 排序不同
            return strtotime($row['date']).sprintf('%-03s', (999 - $row['amount']));
            // 相反 如果是date 用一个最大数减去strtotime($row['date'])
        })->values()->all();
4年前 评论
largezhou 4年前
hldh214 4年前
Rxy-development (楼主) 4年前
largezhou 4年前
hldh214 4年前
Rxy-development (楼主) 4年前
largezhou 4年前
$collection = collect($last_data['data']);
            $sorted = $collection->sortByDesc(function ($row, $key) {
                return $row['send_amount'].$row['date'];
            });

我这样写测出来的

  47 => array:3 [
    "id" => 992
    "date" => "2019-07-02"
    "send_amount" => 99
  ]
  8 => array:3 [
    "id" => 544
    "date" => "2019-07-02"
    "send_amount" => 9
  ]
  167 => array:3 [
    "id" => 1068
    "date" => "2019-07-01"
    "send_amount" => 9
  ]
  58 => array:3 [
    "id" => 1041
    "date" => "2019-07-02"
    "send_amount" => 90601
  ]
  158 => array:3 [
    "id" => 1041
    "date" => "2019-07-01"
    "send_amount" => 89200
  ]
  18 => array:3 [
    "id" => 702
    "date" => "2019-07-02"
    "send_amount" => 86
  ]
  29 => array:3 [
    "id" => 876
    "date" => "2019-07-02"
    "send_amount" => 8
  ]
  41 => array:3 [
    "id" => 947
    "date" => "2019-07-02"
    "send_amount" => 8140
  ]
  5 => array:3 [
    "id" => 463
    "date" => "2019-07-02"
    "send_amount" => 81301
  ]
4年前 评论

这里的 sortBy 和数据库的不一样,所以要自己写回调去处理逻辑。

4年前 评论
Rxy-development (楼主) 4年前
flc1125

假设 优先按 date 排,相同按 send_amount 排序,操作大致如下:

  • date 转换一个比较的数据(如int),并根据赋值 * 1000,其中 1000 是示例
  • send_amount 也一样,但 * 100,其中 100 一定要比 100000 小至少一几别
  • 将转换后的两个值进行相加后,在排序

Laravel 的集合排序跟数据库的排序理解是不一样的

4年前 评论
Rxy-development (楼主) 4年前
Epona

collection 里的 sortBy 不会有 SQL里的那种效果的。 可以试试 array_multi_sort 这种方法(很蛋疼的一种方法😂

4年前 评论

@lostinfo 看了下源码,您这样写其实实现不了的,它会变成,send_amount和date连接在一起,然后再进行排序.

//类似
[20000.1970-01-01, 20111.1970-01-02]
//变成了这种数组然后再用arsort或者asort排序,达不到效果
4年前 评论
lostinfo 4年前
lostinfo 4年前
Rxy-development (作者) (楼主) 4年前

我用的时候有效果呀? :flushed:

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!