Благодарим за оказанную помощь Osuwariboy! Это было похоже на тяжелую борьбу, но это работает, наконец. Благодаря вам.
Постараюсь полностью описывают случай с раствором:
У меня есть расписание.CSV файл отформатирован как этот (дата, неиспользуемый номер, время переключения, смены длины, имена (до 6):
...
01 Oct 2015 ,65 ,07:00 - 15:00 ,8 ,"","John Doe","Joe Smith","Martin Taylor","Henry Smith","Mike Miller"
01 Oct 2015 ,22 ,15:00 - 23:00 ,8 ,"","Bob Ford","Sarah Smith","Jack Williams","",""
01 Oct 2015 ,11 ,23:00 - 7:00 ,8 ,"","","Jenny Roe","Adam Davis","Jake Blake",""
02 Oct 2015 ,21 ,07:00 - 19:00 ,12 "Antonio Garcia","John Doe","Joe Smith","","Henry Smith","Mike Miller"
02 Oct 2015 ,22 ,19:00 - 07:00 ,12 ,"","Bob Ford","Sarah Smith","Jack Williams","",""
02 Oct 2015 ,11 ,07:00 - 15:00 ,8 ,"","","Jenny Roe","Adam Davis","Jake Blake",""
...
Основной проблемой здесь является то, что я ищу людей, запланированных не текущий, ., но для следующего сдвига сдвиги 8h (регулярный) или 12h (выходные и некоторых случайных дней) Исходя из этого, я не могу просто смотреть 8 или 12 часов вперед, так как это создает различные проблемы, как:.
Там была проблема также с датой смены, когда, например. 01 Oct 2015 23:00 - 7:00
- 1 октября для начала и 2 октября, когда он заканчивается.
Основываясь на кончиках от Osuwariboy я придумал следующее решение:
<?php
date_default_timezone_set('Europe/Warsaw'); //we set the current timezone to match the time from our schedule
$currentDate = new DateTime();
$currentDateRegular = new DateTime(); //object with the time 8h ahead
$currentDateWeekend = new DateTime(); //object with the time 12h ahead
$currentDateRegular->modify('+8 hours');
$currentDateWeekend->modify('+12 hours');
$file = fopen("schedule.csv","r");
$results = array();
$resultsFinal = array();
$resultsDiff = array();
$resultsDiffWeekend = array();
while (($data = fgetcsv($file, 0, ",")) !== FALSE)
{
//we create an array that has four elements: the start time, the "-", the endtime
//of the shifts, and an empty one (not needed)
$shiftTime = explode(" ", $data[2]);
//we create an object with a shift date
$shiftDate = $data[0];
//we create an object with a shift lenght time (8 or 12 hours)
$shiftDiff = $data[3];
//we create an object with a shift start time *including* date
$startShift = dateTime::createFromFormat("d M Y H:i", $data[0] . " " . $shiftTime[0]);
//we create same object as above to modify it with the shift lenght time
$startShiftTemp = dateTime::createFromFormat("d M Y H:i", $data[0] . " " . $shiftTime[0]);
//we create an oject with a shift end time *including* date - that may be different
//from the start time eg. 23:00 - 7:00 (next day)
$endShift = $startShiftTemp->modify('+' . $shiftDiff . " " . 'hours');
//we compare the previously created objects three times: to the current date, date 8h ahead and 12h
//ahead, then if the current date is between the start of the shift and the end of the shift,
//we know who is scheduled to work
if($currentDate >= $startShift && $currentDate <= $endShift) {
$results = $data;
}
if($currentDateRegular >= $startShift && $currentDateRegular <= $endShift) {
$resultsDiff = $data;
}
if($currentDateWeekend >= $startShift && $currentDateWeekend <= $endShift) {
$resultsDiffWeekend = $data;
}
//the most important part here: if the results for the current date are equal with the results for the
//date with the time 8h ahead (not what we want), that means that the final results should be with the
//names for the date 12h ahead from the current date (next shift - we want this)
if($results == $resultsDiff) {
$resultsFinal = $resultsDiffWeekend;
}
//if the results for the current date are not equal with the results for the date with the time 8h ahead
//from now (next shift - we want this) that means that the final results should be with the names for
//shift 8h ahead from the current date
if($results != $resultsDiff) {
$resultsFinal = $resultsDiff;
}
}
//we print the results line by line, but only when there is some data (to avoid creating empty ones as there is
//not always six people during the shift)
if(!empty($resultsFinal[4]))
print_r($resultsFinal[4] . "<BR>");
if(!empty($resultsFinal[5]))
print_r($resultsFinal[5] . "<BR>");
if(!empty($resultsFinal[6]))
print_r($resultsFinal[6] . "<BR>");
if(!empty($resultsFinal[7]))
print_r($resultsFinal[7] . "<BR>");
if(!empty($resultsFinal[8]))
print_r($resultsFinal[8] . "<BR>");
if(!empty($resultsFinal[9]))
print_r($resultsFinal[9] . "<BR>");
?>
Может быть, это не самый красивый или чистый код, но эй, это, кажется, работает при любых условиях. Я надеюсь, что кто-то найдет это полезным.
Спасибо! Это выглядит аккуратно. Я могу понять, как вы это делали, но для меня это не совсем понятно: '$ results = array();' в начале (что это означает?) И в последнем 'if' - (' $ result [ ] = $ data; ') как распечатать вывод в этом примере? – totalizator
Я добавил некоторые объяснения к сообщению. Если все еще неясно, не стесняйтесь спрашивать снова. – Osuwariboy
Так же, как я ожидал, но все же, это меня смутило. Благодаря! Проблема в том, что мне трудно заполнить «$ results». 'Schedule.csv' содержит допустимые записи,' $ startShift' и '$ endShift' заполняется нормально, но когда дело доходит до оператора' if', ничего не может быть прочитано '$ results' - просто пустой' Array() ' , Вы уверены, что я могу сравнить время, когда '$ currentData' является отметкой времени Unix, а другие значения похожи на DateTime Objects? Я добавил 'date_default_timezone_set ('Европа/Лондон'),' чтобы убедиться, что время сгенерировано правильно, и я попробовал '$ currentDate = date ('Y-m-d H: i: s: u');' -no go. – totalizator