2017-01-26 2 views
1

Итак, у меня есть список будних дней, в которых мне нужно проверить, являются ли они текущим днем. Список варьируется между «понедельником/вторником» и «средой-пятницей»Проверьте, не работает ли будний день между буднями в строке

Мое текущее решение - сравнение строк, поэтому оно определяет только текущий день недели в элементе списка.

Heres текущее решение (в PHP кстати):

setlocale(LC_ALL, "danish"); 
$day = get_sub_field('dag'); // the field containing the user input day 
$currentDay = strftime('%a', mktime()); 
$currentDayLower = strtolower($currentDay); 
$dayLowercase = strtolower($day); 

$class = ''; 

if(strpos($dayLowercase, $currentDayLower) !== false){ 
    $class = ' current-day'; 
} else{ 
    $class = ''; 
} 

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

Есть ли очевидный или альтернативный метод, который может быть проще, чем то, что я сейчас делаю?

Любые материалы приветствуются.

EDIT:

Я нашел рабочее решение, которое я отправил в ответ (я не могу выбрать его в качестве ответа в течение 2 дней, хотя). Спасибо за вклад!

+0

Можете ли вы показать реальный пример списка, который вы обрабатываете – RiggsFolly

ответ

0

Так, как я узнал, его довольно сложно сделать datetime из датской недели недели. Гораздо проще перейти с английского и формата на датский.

Так что мне пришлось сделать это немного по-другому, сшив части ваших ответов парней вместе.

<?php while (have_rows('aabningstider_repeater', 'option')) : the_row(); 
// vars 
$day = get_sub_field('dag'); 
$timer = get_sub_field('aabne_timer'); 

$dayLower = strtolower($day); 

$weekArray = array('mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag', 'søndag'); 
$dayArray = preg_split('/[\s,-]+/', $dayLower); 

$today = date('w') - 1; 

$class = ''; 

if(is_array($dayArray)){ 

    $days = []; 
    foreach ($dayArray as $daySingle) { 
     array_push($days, array_search($daySingle, $weekArray)); 
    } 

    if($today > $days[0] && $today < $days[1]){  
     $class = ' current-day in-between-days'; 

    } elseif($today == $days[0] || $today == $days[1]){ 
     $class = ' current-day'; 

    } else{ 
     $class = ''; 
    } 
} 

endwhile; ?> 

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

Любая обратная связь или оптимизация приветствуются. И спасибо за все входы!

-1
setlocale(LC_ALL, "danish"); 
$day = get_sub_field('dag'); // the field containing the user input day 

$currentDayLower = strtolower(date("D")); 
$dayLowercase = strtolower($day); 

$class = ''; 

if($dayLowercase === $currentDayLower) 
    $class = ' current-day'; 
+0

Если у вас есть день в форматах «Понедельник/Вторник» и «Среда - Пятница», сначала используйте их в переменной $ day_list = 'Monday/Tuesday'; $ day_array = explode ("/", $ day_list); а затем использовать if (in_array (дата («D»), $ number_list)) $ class = 'current-day'; – AppCloudData

+0

Пожалуйста, используйте ссылку [edit], объясните, как работает этот код, и не просто передайте код, так как объяснение, скорее всего, поможет будущим читателям. См. Также [ответ]. [источник] (http://stackoverflow.com/users/5244995) –

2

Да, ваша идея осуществима и это не должно влиять на производительность плохо, если вы не сделаете это много раз в течение короткого периода времени, где много начинается в масштабе сотен тысяч. Обратите внимание, что я создал array из $weekdays и заметил, что когда вы назначаете значение для $class, это знак конца для цикла.

setlocale(LC_ALL, "danish"); 
$day = get_sub_field('dag'); // the field containing the user input day 
$dayLowercase = strtolower($day); 
$weekdays = array("monday", "tuesday", "wednesday", "thursday", "friday"); 

$class = ''; 

for ($index = 0, (!$class) && ($index < 5); $index++) { 
    if(strpos($dayLowercase, $weekdays[$index]) !== false){ 
     $class = ' current-day'; 
    } else{ 
     $class = ''; 
    } 
} 
+0

Извините, я, вероятно, должен был указать. Все это находится в цикле while, перебирая несколько полей дня. Это для печати часов. Поставят в любой: понедельник вторник среда и т.д ... Или: понедельник - четверг пятницу субботу - воскресенье С вашим примером каждый субъект поля день получает ток-дневный класс, если он содержит будний день. –

1

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

$period = 'Wednesday-Friday'; 
$limitDays = explode('-', $period); 
$startDayName = trim(strtolower($limitDays[0])); 
$endDayName = trim(strtolower($limitDays[1])); 

$today = new DateTime(); 
$todayName = strtolower($today->format('l')); 

// Check if the startDay or endDay is today. 
echo "$startDayName $endDayName $todayName\n"; 
if ($startDayName === $todayName || $endDayName === $todayName) { 
    echo "Same day\n"; 
    $class = 'current-day'; 
} else { 
    // Get a date time representing the start day. 
    $startDay = new \DateTime(); 
    $startDay->modify("next $startDayName"); 

    // Based on the start day, get the next current day. 
    $thisDay = new \DateTime(); 
    $thisDay->modify("next $startDayName"); 
    $thisDay->modify("next $todayName"); 

    // Based on the start day, get the next end day. 
    $endDay = new \DateTime(); 
    $endDay->modify("next $startDayName"); 
    $endDay->modify("next $endDayName"); 

    // Check if thisDay is between the startDay and endDay. 
    if ($startDay < $thisDay && $thisDay < $endDay) { 
     $class = 'current-day'; 
    } else { 
     $class = ''; 
    } 
} 
echo $class . "\n"; 

Я не уверен, что это проще и эффективнее, но это не плохой способ сделать это.

+1

Это похоже на хорошее решение. К сожалению, пользовательский ввод находится на датском языке, и, насколько я смог собрать, преобразование строки локального языка в будний день в метку времени практически невозможно, если вы не делаете это вручную для каждого буднего дня. Я смог преобразовать ваш метод в массив будних дней и использовать array_search, чтобы найти позицию по будням в массиве. Может быть, немного взломать, но до сих пор его разработка. –

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