Zliczanie czasu bez dublowania

0

Witajcie, ja tu nowy - nie bijcie.

Mam tablice z czasami wejścia i zejścia (int/timestamp) z panelu (są 4 panele).
Na każdy panel można wejść i zejść w dowolnej chwili, dowolną ilość razy i można też nie być na żadnym a potrzebuje zliczyć łączny czas przebywania na jakimkolwiek panelu ale bez dublowania się czasu jak to ma miejsce w przypadku liczenia czasu od wejścia do zejścia dla każdego wpisu z osobna.

np siedze na P1 10:00-12:00, na P2 siedze 11:00-11:10 i 11:30-11:50 a na P3 i P4 9-11:30. Wynikiem powinno być 3h.

Przykładowa tablica:

Array
        (
            [0] => Array
                (
                    [start] => 1516003200
                    [end] => 1516012200
                    [panel] => Array
                        (
                            [0] => "P4"
                        )

                )

            [1] => Array
                (
                    [start] => 1516006800
                    [end] => 1516014000
                    [panel] => Array
                        (
                            [0] => "P2"
                        )

                )

            [2] => Array
                (
                    [start] => 1516010400
                    [end] => 1516011000
                    [panel] => Array
                        (
                            [0] => "P1"
                            [1] => "P2"
                        )

                )

            [3] => Array
                (
                    [start] => 1516012200
                    [end] => 1516013400
                    [panel] => Array
                        (
                            [0] => "P1"
                            [1] => "P2"
                        )

                )

        )

Jakiś pomysł jak się za to zabrać i zliczyć realny czas na panelu, bez znaczenia na którym??

0

Przepętlować tablicę z czasami i zsumować różnice?

Nie pomagamy za darmo :)
Robisz foreach na tablicy, odemujesz end od start, wrzucasz np. do tablicy tą różnicę a potem array_sum sumujesz.
Jak chcesz mieć wyniki na godziny, dzielisz czas przez 3600 i masz :)

0

Niestety to nie takie proste bo czasy nachodzą na siebie i sumując tylko różnice z każdego wychodzi bzdura :(

(P1 10-12:00) + (P2 11-12:00) = 7200+3600 = 3h a przecież 10-12 to 2h rzeczywistego czasu.

1

posortuj wg czasu rozpoczęcia i sprawdzaj czy początek kolejnego okresu zachodzi na koniec poprzedniego

function cmp($a, $b) {
 if($a['start'] == $b['start']) return 0;
 return ($a['start'] < $b['start'])?-1:1;
}

$a = array(
 3 => array('start'=>1516012200, 'end'=>1516013400),
 2 => array('start'=>1516010400, 'end'=>1516011000),
 1 => array('start'=>1516006800, 'end'=>1516014000),
 0 => array('start'=>1516003200, 'end'=>1516012200),
);

uasort($a, 'cmp');

$sum = 0; $prev_end = 0;
foreach($a as $v) {
 $start = $v['start'];
 $end = $v['end'];
 if($start < $prev_end) $start = $prev_end;
 if($end > $start) {
  $sum += ($end - $start);
  $prev_end = $end;
 }
}

echo "suma: ", date("H:i:s", mktime(0, 0, $sum)), "\n";

0

Jeszcze to potestuje ale wygląda na to, że działa idealnie jak potrzebuje. Bardzo dziękuje @Dżery

0
Valhali napisał(a):

Jeszcze to potestuje ale wygląda na to, że działa idealnie jak potrzebuje. Bardzo dziękuje @Dżery

No - nie ma to jak dać rybę zamiast wędki.. Rośnie nam piękne pokolenie programistów..

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