PHP: получить сумму различных дат в массиве - PullRequest
1 голос
/ 10 июля 2019

Здравствуйте, я только начинающий программист, но сейчас я создаю приложение, которое получает общее количество часов работы.

Здесь у меня есть массив time_start , в который порог для клиента входит и тот же, что и для time_end

Журналы здесь, где человек регистрируется.

            $time_start = [
                [0] => '22:00:00',
                [1] => '03:00:00',
                ];
            $time_end = [
                [0] => '02:00:00',
                [1] => '08:00:00',
                ];
            $logs = [
                [0] => '2019-07-09 22:00:00',
                [1] => '2019-07-10 02:00:00',
                [2] => '2019-07-10 03:00:00',
                [3] => '2019-07-10 08:00:00',
            ];

Так что я пытаюсь получить сумму их часов в ночную смену с другой датой.

Я пытаюсь получить это:

            foreach( $logs as $check_time ){

                $attendance_date_time = date("Y-m-d",strtotime($check_time));
                $time_starts = date('Y-m-d H:i:s', strtotime("$attendance_date_time $time_start"));
                $time_ends = date('Y-m-d H:i:s', strtotime("$attendance_date_time $time_end"));
                if ( $check_time >= $time_starts && $check_time <= $time_ends )
                {
                    $time[] = $check_time;
                }else{
                    $time = null
                }

            }

Возможно, я получу все журналы, потому что они находятся между time_start и time_end, и сохраню их в $ time

И суммируя время, которое я получаю.

Поскольку я новичок в php, является ли их самой простой идеей получить общее количество рабочих часов? Потому что я получаю нулевое значение, потому что полученное время было датой check_in.

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Вот ваш фрагмент,

$time_start = [
    0 => '22:00:00',
    1 => '03:00:00',
];
$time_end = [
    0 => '02:00:00',
    1 => '08:00:00',
];
$logs = [
    0 => '2019-07-09 22:00:00',
    1 => '2019-07-10 02:00:00',
    2 => '2019-07-10 03:00:00',
    3 => '2019-07-10 08:00:00',
];
$time = [];
$diff = 0;
for ($j = 0; $j < count($logs); $j = $j + 2) {
    $attendance_start = date("Y-m-d", strtotime($logs[$j]));
    $attendance_end   = date("Y-m-d", strtotime($logs[$j + 1]));
    for ($i = 0; $i < count($time_start); $i++) {
        $time_starts = date('Y-m-d H:i:s', strtotime("$attendance_start " . $time_start[$i] . ""));
        $time_ends   = date('Y-m-d H:i:s', strtotime("$attendance_end " . $time_end[$i] . ""));
        if ($logs[$j] >= $time_starts && $logs[$j + 1] <= $time_ends) {
            array_push($time, $logs[$j], $logs[$j + 1]);
            // calculating diff for two alternate days
            $diff += (round((strtotime($logs[$j + 1]) - strtotime($logs[$j])) / 3600, 1));
            break;
        }
    }
}
echo $diff . " Hours";die;

Демо

Выход: -

9 Hours
0 голосов
/ 10 июля 2019

Цикл for - это самый простой способ сделать это

$time_start = [
  '22:00:00',
  '03:00:00',
];
$time_end = [
  '02:00:00',
  '08:00:00',
];
$logs = [
  '2019-07-09 22:00:00',
  '2019-07-10 02:00:00',
  '2019-07-10 03:00:00',
  '2019-07-10 08:00:00',
];

$totalDiff = 0;

for($i =0 ; $i < count($logs); $i = $i + 2)
{
  $startDate = strtotime($logs[$i]);
  $endDate = strtotime($logs[$i+1]);

  $diff = $endDate-$startDate;

  $totalDiff += $diff;
}

$hourDiff = $totalDiff / 3600;
echo $hourDiff . ' hours';

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...