Групиране на елементите на масив спрямо времеви период

mapka7a

Registered
Здравейте,

от известно време мъча да направя следното:

имам някакви данни които взимам от база.
След като ги взема трябва да ги групирам на база период - ден, седмица, месец. Т.е. ако периода които е избран е <= 7 дни групирам по ден (тук е ясно).
Ако периода е >7 групирам на седмична база и ако е повече от 30 на месечна.

Посленото което бях измъдрил е това
http://pastebin.com/DKu74ysP
чиито резултат е - http://pastebin.com/QkKBW42R

Но не мога да го доизмисля
това което целя е накрая да получа нещо подобно

Код:
[2017-02-13 - 2017-02-20] =>
[0]=>....
[1]=>....
[2]=>...

Реално ключът на масива да бъде е периода на групиране, и ако има ден за който няма стойност той трябва да бъде запълнен с нулеви стойности.

Някой ако има някакви идеи/насоки, ако може да ги сподели
 
uphero каза:
А защо още в заявката не си ги сортираш по дата?
аз ги сортирам в заявката по дата, и така ще мога да отпиша дневното сортиране ако период е <= 7.
Но не мога да го измисля за седмица и месец, така че да мога да получа и периода за който е групиран.
Нека дам 1 пример.

Да предположим че искаш да видиш продажби за 2 седмици назад и избираш период от 1 фев. до 15 фев.
аз ще ги взема от базата, но после трябва да покажа нещо такова

1.02.2017 - 7.02.2017 - средна стойност
8.02.2017 - 15.02.2017 - средна стойност


и дори и да няма резултат за дадения период, ще трябва да покажа

1.02.2017 - 7.02.2017 - 0

Та реално проблема ми е как да хвана всички записи за 1 седмица, като резултата за един ден е X , т.е. не е само 1

===============================================

EDIT: В крайна сметка успях да го измъдря.Деля масива на отделни части (array_chunk) в зависимост от това какво ми трябва (седмица,месец...), после ги въртя и добавям стойностите.

Ше постна и кода, ако на някой му трябва + ако имате някакви забележки/опции за подобрение :)

Код:
$result = [];
        foreach ($chunkData as $item) {
            $itemKeys = $item->keys();
            $startDatePeriod = $itemKeys->first();
            $endDatePeriod = $itemKeys->last();
            foreach ($item as $value) {
                $j = 0;
                foreach ($value as $key => $val) {
                    if ((int)$val['price'] === 0) {
                        $result[$startDatePeriod . '-' . $endDatePeriod][$j]['name'] = '';
                        $result[$startDatePeriod . '-' . $endDatePeriod][$j]['value'] = 0;
                    } else {
                        if (array_search($val['name'], array_column($result[$startDatePeriod . '-' . $endDatePeriod], 'name')) !== false) {
                            $result[$startDatePeriod . '-' . $endDatePeriod][$j]['value'] += $val['price'];
                        } else {
                            $result[$startDatePeriod . '-' . $endDatePeriod][$j]['name'] = $val['name'];
                            $result[$startDatePeriod . '-' . $endDatePeriod][$j]['value'] = $val['price'];
                        }
                    }
                    $j++;
                }
            }
        }
 
lam3r4370 каза:
Можеш с функциите year,month да ги групираш още в заявката

Ще се радвам ако може да дадеш някаква примерна заяква,
най-вече не го правя, защото после не ми е ясно как да изкарам групирания период на фронт-енда
 

Горе