2017-01-26 44 views
1

因此,我有一個工作日的列表,我需要檢查它們是否是當天。該列表要麼是「週一/週二和之間變化」週三 - 週五檢查工作日是否在字符串的工作日之間

我目前的解決方案是字符串比較,所以只有在當前工作日是寫在列表項檢測。

繼承人的當前解決方案(在PHP的BTW):

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 = ''; 
} 

我在想,我的所有工作日的陣列和用戶領域的數組中比較當前日期的位置了,但是我如果不知道將是有效的或甚至可能的。

是否有可能比目前我在做什麼容易的任何明顯的或可替代的方法是什麼?

任何輸入,非常感謝。

編輯:

我發現了一個工作的解決方案,這是我張貼的答案(我不能選擇它作爲回答2天雖然)。感謝您的投入!

+0

你能展示一個你正在處理的列表的真實例子 – RiggsFolly

回答

0

所以當我發現,它相當複雜,從丹麥平日串製作日期時間。從英語和格式轉換到丹麥語要容易得多。

,所以我不得不讓它有點不同,通過拼接你們的答案的若干部分。

<?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(date(「D」),$ number_list))$ class ='current-day'; – AppCloudData

+0

請使用[編輯]鏈接說明此代碼的工作方式,不要僅僅提供代碼,因爲解釋更有可能幫助未來的讀者。另見[回答]。 [來源](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來查找數組中的星期幾位置。可能有點破解,但到目前爲止它的工作。 –

相關問題