2015-10-14 13 views
0

У меня есть файл CSV, который представляет собой график сдвигов с датами, часами и именами. Любые идеи, как я могу извлечь имена на основе текущей даты/времени? CSV выглядит следующим образом:Как импортировать и печатать значения CSV на основе текущей даты?

... 
14 Oct 2015, 02, 12:00 - 18:00, 6, "", "John Doe", "Joe Smith" 
14 Oct 2015, 03, 18:00 - 00:00, 6, "Jenny Roe", "", "Henry Smith" 
15 Oct 2015, 01, 00:00 - 06:00, 6, "Jake Blake", "Bob Ford", "" 
... 

Что мне нужно это запустить код и напечатать имена людей, которые запланировано на следующую смену как:

Jenny Roe 
Henry Smith 

Я знаю, что я могу загрузить файл в массив так:

<?php 
$csv = array(); 
$lines = file('schedule.csv', FILE_IGNORE_NEW_LINES); 

foreach ($lines as $key => $value) 
{ 
    $csv[$key] = str_getcsv($value); 
} 

echo '<pre>'; 
print_r($csv); 
?> 

Или напечатать его в виде текста:

<?php 
$file = fopen("schedule.csv","r"); 

while(! feof($file)) 
    { 
$line_of_text = fgets($file); 
print $line_of_text . "<BR>"; 
    } 
fclose($file); 
?> 

Теперь, мне интересно, с какого направления лучше начать? Если кто-то может помочь мне решить это, я обещаю, что в конце концов я буду изучать PHP (doh!) И после этого отправлю ответ здесь как доказательство.

ответ

0

Я хотел бы попробовать сделать что-то вроде этого:

$currentDate = new DateTime(); //we create an object with the current time 

$file = fopen("schedule.csv","r"); 

$results = array(); 

//we loop through the file, each line will be an array containing each fields 
while (($data = fgetcsv($file, 0, ",")) !== FALSE) 
{ 
    //we create an array that has three elements: the start time, the "-" and the endtime of the shifts 
    $shiftTime = explode(" ", $data[2]); 
    //We create two datetime objects that mark the beginning of the shift and the end of the shift 
    $startShift = dateTime::createFromFormat("d M Y H:i", $data[0] . " " . $shiftTime[0]); 
    $endShift = dateTime::createFromFormat("d M Y H:i", $data[0] . " " . $shiftTime[2]); 

    //We compare the two previously created objects to the current date and if 
    //the current date is between the start of the shift and the end of the shift, 
    //we know that person is scheduled to work. 
    if($currentDate >= $startShift && $currentDate <= $endShift) 
     $results[] = $data; 
} 

Я добавил комментарии в коде, чтобы объяснить, что я сделал.

ОБНОВЛЕНИЕ: В ответ на запрос Тотализатора, вот более подробное объяснение того, что на самом деле делает мое окончательное утверждение «Если». Прежде всего, была напечатана опечатка в переменной, которую я исправил ... ее следует читать «результаты», а не «результат». В любом случае, объект заключительного заявления «если» должен определить, должен ли человек работать, когда мы говорим. «Как мы говорим» часть уравнения содержится в переменной $ currentDate, которую мы создали в первой строке скрипта. Затем мы создаем еще две временные метки с именем $ startShift и $ endShift, которые определяют, когда начинается смена человека и когда он заканчивается. Все, что нам нужно сделать, это определить, находится ли текущий currentDate где-то между $ startShift и $ endShift, что и есть условие if.

После этого, если $ currentDate действительно падает между $ startShift и $ endShift, мы сохраняем текущую строку в отдельном массиве, который я назвал $ results, так что в конце цикла результаты $ будут содержать только строки людей, которые должны сейчас работать.

Для дальнейшего объяснения, когда вы

$results[] = $data 

Это фактически добавляет содержимое $ данных в конец массива $ результатов. Итак, в конце концов, у вас будет что-то вроде этого:

$results[0] => array(14 oct 2015, 02, 12:00 - 18:00, 6, "", "John Doe" ...) 
$results[1] => array(15 oct 2015, 01, 18:00 - 00:00, 6, "Jenny Roe", ...) 
$results[2] => array(16 oct 2015, 02, 00:00 - 06:00, 6, "Jane Doe", ...) 

Итак, у вас оно есть. Надеюсь, это прояснит ситуацию.

+0

Спасибо! Это выглядит аккуратно. Я могу понять, как вы это делали, но для меня это не совсем понятно: '$ results = array();' в начале (что это означает?) И в последнем 'if' - (' $ result [ ] = $ data; ') как распечатать вывод в этом примере? – totalizator

+0

Я добавил некоторые объяснения к сообщению. Если все еще неясно, не стесняйтесь спрашивать снова. – Osuwariboy

+0

Так же, как я ожидал, но все же, это меня смутило. Благодаря! Проблема в том, что мне трудно заполнить «$ 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

0

Благодарим за оказанную помощь 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 часов вперед, так как это создает различные проблемы, как:.

  • вид 8h впереди в начале 12-часовой смены (показывает тот же сдвиг)

  • смотрит 12h вперед ближе к концу 8h сдвига (пропускает следующий)

Там была проблема также с датой смены, когда, например. 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>"); 
?> 

Может быть, это не самый красивый или чистый код, но эй, это, кажется, работает при любых условиях. Я надеюсь, что кто-то найдет это полезным.

 Смежные вопросы

  • Нет связанных вопросов^_^