PHP - Как найти пропущенные даты в массиве дат и заполнить пропущенный пробел - PullRequest
1 голос
/ 06 февраля 2020

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

Получение данных из базы данных

$stmt=$db_con->prepare("SELECT date_from, date_to, country FROM work WHERE worker_id=xx");

while($row = $stmt->fetch()) { <br>
   ...
   ...
data = array("date_from" => $date_from, "date_to" => $date_to, "country" => $country);
}


Данные, которые я получаю, выглядят так

15.01.2020 --- 20.01.2020 --- Страна 0
01.02.2020 --- 05.02.2020 --- Страна 1
10.02.2020 --- 20.02.2020 - - Страна 2


Эти даты означают, когда работник начинает и заканчивает работу за границей. Мне нужно узнать даты, чтобы узнать, когда работник работал на родине. Дата до первого, после последнего и промежуточного означает работу на родине. Мои окончательные данные должны быть сохранены в массиве так:


01.01.2020 --- 14.01.2020 --- Home

15.01. 2020 --- 20.01.2020 --- Страна 0

21.01.2020 --- 31.01.2020 --- Домашняя страница

01.02.2020 --- 05.02 .2020 --- Страна 1

6.02.2020 --- 09.02.2020 --- Home

10.02.2020 --- 20.02.2020 --- Страна 2

21.02.2020 --- 31.12.2020 --- Домашняя страница



Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Я предполагаю, что 2019 ваш пример является опечаткой, поскольку остальная часть массива отсортирована правильно.

Здесь я сначала проверяю, что первый элемент датирован первым из указанного месяца. Если нет, то это добавляет «начало» месяца.

Затем он входит в l oop и проверяет, есть ли пробел между предметами, и добавляет домашний предмет, если есть пробел.

$arr = array ( 0 => array ( 'datum_od' => '01.01.2020', 'datum_do' => '10.01.2020', ), 1 => array ( 'datum_od' => '15.01.2020', 'datum_do' => '20.01.2020', ), 2 => array ( 'datum_od' => '01.02.2020', 'datum_do' => '05.02.2020', ), 3 => array ( 'datum_od' => '25.11.2020', 'datum_do' => '25.12.2020', ));
$end_date = 0;

if(date('d', strtotime($arr[0]['datum_od'])) != '01'){
    $end_date = date('d.m.Y', strtotime($arr[0]['datum_od'] . ' -1 day')); 
    $new[] = array('datum_od' => date('01.m.Y', strtotime($arr[0]['datum_od'])), 'datum_do' => $end_date, 'home');
}

foreach($arr as $key => $item){
    if(date("d.m.Y", strtotime($end_date . " +1 day")) != date('d.m.Y', strtotime($item['datum_od']))){
        $end_date = date('d.m.Y', strtotime($item['datum_od'] . ' -1 day')); 
        $new[] = array('datum_od' => date('d.m.Y', strtotime($arr[$key-1]['datum_do'] . " +1 day")), 'datum_do' => $end_date, 'home');
        $new[] = $item;
    }else{
        $new[] = $item;
    }
}

var_dump($new);

https://3v4l.org/lCOGv

0 голосов
/ 06 февраля 2020

может быть достигнуто PHP

// First day of the month.
echo date('Y-m-01', strtotime($query_date));

// Last day of the month.
echo date('Y-m-t', strtotime($query_date));

ex:

while($row = $stmt->fetch()) {
$first_day = date('Y-m-01', strtotime($date_from));
$before_date_from= date('Y-m-d', strtotime($date_from." - 1 day"));
$last_day = date('Y-m-t', strtotime($date_from));
$after_date_to = date('Y-m-d', strtotime($date_to." + 1 day"));
$data[] = array("date_from" => $first_day, "date_to" => $before_date_from, "country" => "Home");
$data[] = array("date_from" => $date_from, "date_to" => $date_to, "country" => $country);
$data[] = array("date_from" => $after_date_to, "date_to" => $last_day, "country" => "Home");
}

print_r($data); // check your result here..
...