Я работаю над платформой спортивной аналитики, использую платформу Laravel. У меня есть таблица WORKOUT, как показано ниже

| workoutDay |TSS|    
| ---------- |---|    
| 2020-10-01 | 20|  
| 2020-10-10 | 50|
| 2020-10-15 | 30|

Так что у нас будет массив из выбранного запроса:

 $tssData=  [
     [2020-10-01,20],
     [2020-10-10,50],
     [2020-10-15,30],
    ]

У меня также есть рекурсивная формула для расчета физической подготовки спортсмена.

 $count = count($tssData);
        $fitness[] = 0;
        $result= [];
        for ($i = 1; $i < $count + 1; $i++) {
            $result[] = [
                $workoutDay[] = $tssData[$i - 1][0],
                $fitness[] = $fitness[$i - 1] + (($tssData[$i - 1][1] - $fitness[$i - 1]) / 7),

        }
        return $result;
    }

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

$tssData=  [
     [2020-10-01,20],
     [2020-10-02,0],
     [2020-10-03,0],
     ... ,
     [2020-10-10,50],
     [2020-10-11,0],
     [2020-10-12,0],
     [2020-10-13,0],
     .... ,
     [2020-10-15,30],
    ]

И я не думаю, что было бы правильным решением добавлять все дни один за другим в таблицу db с 0 TSS.

0
Ehsan Pro 25 Фев 2021 в 13:14

1 ответ

Лучший ответ

Спасибо, ребята, за ваши решения. Я создал целевой массив и исправил его, используя слияние CarbonPeriod и Laravel Collection следующим образом:

        // Fetch workouts
        $tssData = Workout::select('workoutDay', 'tss')->get();
        
        //changing the data to Key:value
        $sumTss = $tssData->groupBy('workoutDay')->map(function ($item) {
            return $item[0]['tss'];
        });

        // creating default array included the all missed dates  with zero value
        $date2 = new Carbon($tssData->last()->workoutDay);
        $date1 = new Carbon($tssData->first()->workoutDay);
        $period = CarbonPeriod::create($date1, $date2);
        foreach ($period as $date) {
            $p[$date->format('Y-m-d')] = 0;
        }

       // using collection merging for comparing and replacing quickly
        $tssData = collect($p)->merge(collect($sumTss))->toArray();
        return $tssData;
0
Ehsan Pro 25 Фев 2021 в 21:03