Laravel группировка по смене ключей - PullRequest
1 голос
/ 06 февраля 2020

Привет, у меня есть оговорки и время их начала. Теперь мне нужно перенести его.

        $monthlyAmounts = Reservation::all()
        ->groupBy(function ($proj) {
            return cdate($proj->start_time)->format('Y-m');
        })
        ->map(function ($month) {
            return $this->sumTime($month);
        });

sumTime - моя функция для вычисления разницы между временем начала и конца. cdate - это помощник -> carbon :: parse ($ date) ..

В результате:

array:2 [▼
  "2020-01" => 60
  "2020-02" => 420
]

Need

Но для API было бы лучше Вот так:

[
    "2020" => [
        '01' => 60,
        '02' => 30
    ],
    "2021" => [
        '01' => 30,
    ]
]

Моя попытка

К сожалению, я не могу сделать это так. Я попытался:

    $monthlyAmounts = Reservation::all()
        ->groupBy(function ($proj) {
            return cdate($proj->start_time)->format('Y-m');
        })
        ->map(function ($month) {
            return $this->sumTime($month);
        })
        ->mapToGroups(function ($item,$key) {
            $arrkey = explode('-',$key);
            return [$arrkey[0]=>[$arrkey[1]=>$item]];
        });

Но это делает это:

array:1 [▼
  2020 => array:2 [▼
    0 => array:1 [▼
      "01" => 60
    ]
    1 => array:1 [▼
      "02" => 420
    ]
  ]
]

Так что я не могу сделать $ res ['2020'] ['01']. Как это сделать?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Попробуйте это:

$monthlyAmounts = Reservation::all()
        ->groupBy(function ($proj) {
            return cdate($proj->start_time)->format('Y');
        })
        ->map(function ($items) {
            return $items->groupBy(function($item) {
                return cdate($item->start_time)->format('m');
            })
            ->map(function($month) {
                return $this->sumTime($month);
            }); 
        });
0 голосов
/ 06 февраля 2020

Другой метод с использованием foreach l oop

...
$monthlyAmounts = Reservation::all();
$new = [];
foreach($monthlyAmounts as $key => $val)
{
  $dis = explode('-', $key);
  $new[$dis[0]][$dis[1] = $val;
}
print_r($new);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...