对数组使用 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应该怎么写

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
Epona
最佳答案

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

6个月前 评论
讨论数量: 6
$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();
6个月前 评论
largezhou 6个月前
hldh214 6个月前
Rxy-development (楼主) 6个月前
largezhou 6个月前
hldh214 6个月前
Rxy-development (楼主) 6个月前
largezhou 6个月前
$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
  ]
6个月前 评论
青风百里

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

6个月前 评论
Rxy-development (楼主) 6个月前
flc1125

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

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

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

6个月前 评论
Rxy-development (楼主) 6个月前
Epona

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

6个月前 评论

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

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

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!