PHP: получить сумму разных дат в массиве

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

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

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

            $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, есть ли у них самая простая идея получить общее количество рабочих часов? Потому что я получаю нулевое значение, потому что полученное time_end было датой check_in.

суммирование означает, что именно общее количество часов между этими датами?

Rahul 10.07.2019 08:00

да. В приведенных логах результат будет 9 часов

Rubics 10.07.2019 08:01

Как это будет 9 часов, можете объяснить? Потому что я вижу его 5 часов!

Rahul 10.07.2019 08:02
2019-09-09 22:00 до 2019-09-10 02:00 равно 4hours. 2019-07-10 03:00:00 до 2019-07-10 08:00:00 равно 5hours
Rubics 10.07.2019 08:07

Поскольку журналы $ находятся между time_in и out, они добавляются к массиву $time. И добавьте каждый массив. равно 9 часам

Rubics 10.07.2019 08:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
259
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

$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
2019-09-09 22:00 до 2019-09-10 02:00 равно 4hours. 2019-07-10 03:00:00 to 2019-07-10 08:00:00 равно 5hours У нас есть даты 2019-09-09 и 2019-09-10
Rubics 10.07.2019 08:12

@ElliotA Я внес изменения в соответствии с вашим требованием. Пожалуйста, посмотрите

Rahul 10.07.2019 09:01

Спасибо. связь, если вы можете помочь мне с этим?

Rubics 11.07.2019 01:41

Цикл 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';

Демо

Другие вопросы по теме