grupowanie danych w tablicy po tygodniu

0

Mam sobie taki problem.
Chciałbym pogropować dane wg tygodnia czyli jak użytkownik w polu formularza html zaznaczy datę np. 28 lutyego to będzie poniedziałek to ma zacząc od poniedziałku ale jak wpisze datę 2 marca 2022 to zacznie od środy i teraz mogę zaznaczyć datę końca jak nic nie wpiszę to ustawi na date("Y-m-d); ale mogę ustawić.

I teraz mam sobie w jakiejś tablicy PHP

takie dane.

 $array->[0]['date_start'] = '2019-05-23 13:00:00'
 $array->[0]['level_mood'] = 1.4
 $array->[0]['date_end'] = '2019-05-23 14:00:00'
 $array->[0]['level_anxienty'] - -4
 
$array->[1]['date_start'] = '2019-05-23 14:00:00'
$array->[1]['level_mood'] = 6
$array->[1]['date_end'] = '2019-05-23 14:40:00'
$array->[1]['level_anxienty'] = 12.5

$array->[1]['date_start'] = '2019-05-26 14:00:00'
$array->[1]['level_mood'] = 6
$array->[1]['date_end'] = '2019-05-26 14:40:00'
$array->[1]['level_anxienty'] = 12.5

$array->[1]['date_start'] = '2019-06-14 14:00:00'
$array->[1]['level_mood'] = 6
$array->[1]['date_end'] = '2019-06-14 16:40:00'
$array->[1]['level_anxienty'] = 12.5

$array->[1]['date_start'] = '2019-06-16 14:00:00'
$array->[1]['level_mood'] = 6
$array->[1]['date_end'] = '2019-06-16 14:40:00'
$array->[1]['level_anxienty'] = 12.5

$array->[1]['date_start'] = '2019-06-18 14:00:00'
$array->[1]['level_mood'] = 6
$array->[1]['date_end'] = '2019-05-18 14:40:00'
$array->[1]['level_anxienty'] = 12.5

I teraz pytanie jest takie czy da się to jakoś prosto napisać w PHP, że dla następujących danych wejściowych date_from = 2019-05-20 - 2019-06-20

pogrupuje to wg tygodnia czyli w tym przypadku da taki wynik.

data level_mood count
2019-05-20 - 2019-05-26 4,028 3
2019-06-10 - 2019-06-16 6 2
2019-06-17 -2019-06-23 6 1
2

Co to do jasnej anielki jest $array->[0]? :o Syntax error

Ale da się. Zwykły group-by w PHP.

function groupByWeekday(array $array):array {
  $grouppedBy = [];
  foreach ($array as $item) {
      $weekday = weekday($item['date_start']);
      $grouppedBy[$weekday][] = $item;
  }
  return $grouppedBy;
}

function weekdayName(string $date): string {
  $days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
  return $days[weekday($date)];
}

function weekday(string $date): int {
  return date('w', strtotime($date));
}
0

@TomRiddle: To jest tablica obiektowa To w zasadzie powinno być tak $array[1]->date_start

0
tomixtomi0001 napisał(a):

@TomRiddle: To jest tablica obiektowa To w zasadzie powinno być tak $array[1]->date_start

Mówiąc "obiekt" masz na myśli stdClass? Bo jeśli tak to nie używaj tego. Albo zwykłe klasy albo arraye, jeśli chodzi o PHP.

0

@TomRiddle: Tylko, że tu jest jeden problem z tym przykładem, że dni np. od 2019-04-05 - 2019-06-30 nie muszą mieć wszystkie dni przypisanego nastroju równie dobrze może ten okres dat nie mieć żadnego nastroju.

0
tomixtomi0001 napisał(a):

@TomRiddle: Tylko, że tu jest jeden problem z tym przykładem, że dni np. od 2019-04-05 - 2019-06-30 nie muszą mieć wszystkie dni przypisanego nastroju równie dobrze może ten okres dat nie mieć żadnego nastroju.

No to po czym dokładnie Ty chcesz pogrupować te dane?

0

@TomRiddle: po całym tygodniu

0

Coś takiego?

function groupByWeekday(array $array):array {
  $grouppedBy = [];
  foreach ($array as $item) {
      $grouppedBy[groupKey($item)][] = $item;
  }
  return $grouppedBy;
}

function groupKey(array $item) {
  $startDate = $item['start_date'];
  $startDateWeekday = weekdayName($item['start_date']);
  
  $endDate = $item['end_date'];
  $endDateWeekday = weekdayName($item['end_date']);

  return $startDateWeekday . ' - ' . $endDateWeekday; // tutaj po prostu zwróć to po czym ma grupować.
}

function weekdayName(string $date): string {
  $days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
  return $days[weekday($date)];
}

function weekday(string $date): int {
  return date('w', strtotime($date));
}

Bardzo chaotycznie opisałeś swój problem, ja w ogóle nie wiem co Ty chcesz osiągnąć.

Napisz najlepiej co chcesz osiągnąć ze szczegółami.

4

Zdaje się, że całość masz w Laravelu gdzie już w standardzie był Carbon. Czyli datę transformujemy na obiekt Carbon. Dodajemy sobie jakiś klucz w tej tablicy typu weekNo i korzystając z Carbon możesz wykorzystać metodę weekOfYear() Grupowanie zostało pokazane. Ewentulnie skorzystaj z kolekcji Eloquentowych. Oczywiście możesz też w pełni na piechotę, tylko po co?

1 użytkowników online, w tym zalogowanych: 0, gości: 1