Laravel фильтрация и сортировка коллекции по условиям - PullRequest
0 голосов
/ 24 марта 2020

У меня есть коллекция, например, со следующими данными:

collect([
                        [
                            'id'       => 1,
                            'bankName' => 'Dare-Schmitt',
                            'pmt'      => 47068.084449396,
                            'period'   => 240
                        ],
                        [
                            'id'       => 2,
                            'bankName' => 'Dare-Schmitt',
                            'pmt'      => 45989.430695784,
                            'period'   => 180
                        ],
                        [
                            'id'       => 3,
                            'bankName' => 'Dare-Schmitt',
                            'pmt'      => 55459.759785392,
                            'period'   => 240
                        ],
                        [
                            'id'       => 4,
                            'bankName' => 'Lorenzo-Platto',
                            'pmt'      => 37068.084449396,
                            'period'   => 50
                        ]
                    ]
            );

Мне нужно отсортировать и отфильтровать их по показу только одной записи для того же bankName, где pmt является наибольшим, и просто проверить, где период такой же.

Итак, основываясь на примере после фильтрации и сортировки, я должен получить следующий результат:

        collect([
                    [
                        'id'       => 2,
                        'bankName' => 'Dare-Schmitt',
                        'pmt'      => 45989.430695784,
                        'period'   => 180
                    ],
                    [
                        'id'       => 3,
                        'bankName' => 'Dare-Schmitt',
                        'pmt'      => 55459.759785392,
                        'period'   => 240
                    ],
                    [
                        'id'       => 4,
                        'bankName' => 'Lorenzo-Platto',
                        'pmt'      => 37068.084449396,
                        'period'   => 50
                    ]
                ]
        );

Есть идеи, как этого добиться? Я немного потерял: D

1 Ответ

1 голос
/ 24 марта 2020

Используйте collection method-groupBy для создания записей с одинаковыми backName и одинаковыми period в группе.

И используйте map для получения наибольшего pmt запись:

$data->groupBy(function ($g) {
       return $g['bankName'].' '.$g['period'];
     })->map(function($items) { 
        return $items->sortByDesc('pmt')->first(); // get the highest pmt record
     })->values();
...