2017-09-12 67 views
2

我想創建一個過濾器,如果在列表中找不到日期(星期一,星期二等),我想從DatePeriod中刪除特定的DateTime。我可以這樣說,我星期一和星期二工作。如果你發現這一天是星期四,繼續這個循環,不要包含它。從DatePeriod中刪除日期時間/對象

但是,我似乎無法做到這一點,因爲當我迭代DatePeriod時,我無法取消任何設置,因爲它不會將其視爲數組。有沒有辦法做到這一點?該代碼可以發現如下:

//Get all the start and end dates of the holidays (This will be run iteratively) 
$get_st_date = $row['h_s_date']; 
$get_end_date = $row['h_e_date']; 
//Convert them to approprariate format to be used with DatePeriod 
$get_begin = new DateTime("$get_st_date"); 
$get_end = new DateTime("$get_end_date"); 

//Add an extra day or else it will be omitted from the following process. 
$get_end = $get_end->add(new DateInterval('P1D')); 
//Count per day 
$get_interval = DateInterval::createFromDateString('1 day'); 
$get_period = new DatePeriod($get_begin, $get_interval, $get_end); 
//Iteration Count 
$iter = 0; 
foreach($get_period as $get_dt){ 
    //Find if date is Saturday or Sunday. If it is, break that current loop. 
    $iter++; 
    $str_result = $get_dt->format('l'); 
    if($str_result == "Saturday") {continue;} 
    elseif($str_result == "Sunday") {continue;} 
    elseif(!preg_match("($str_result)", $e_d_w_p_w)){ 
     echo "<br>Don't count this day" . $str_result; 
     unset($get_period[$iter]); 
     continue; 
    } 

然後關閉結束標記(我沒有將它這裏我做一些其他的東西

從上面的代碼,我得到以下錯誤: 「致命錯誤:未捕獲的錯誤:無法使用類型DatePeriod作爲陣列的對象」

有一種解決方法,以這種

澄清:$ e_d_w_p_w是「員工日每週工作」
$Ë _d_w_p_w格式化爲「星期一;星期二」等

+0

是像天的字符串中的一個逗號分隔的列表'$ e_d_w_p_w'?你能提供一個例子嗎? – ishegg

+0

@ishegg更新的問題,以便更好地闡明$ e_d_w_p_w。 「$ e_d_w_p_w被格式化爲」星期一;星期二「等 – cmprogram

回答

1

問題是DatePeriod而不是數組,就像錯誤說的那樣。它只是具有所需的屬性以便製作所需的天數列表,但它不存儲它們,因此您不能在列表中的特定日期使用unset()

,你能做些什麼來實現這一目標是創建一個新的陣列,而不是刪除的天不從DatePeriod符合條件,只添加做這個新陣的日子:

<?php 
$get_st_date = "2017-09-01"; 
$get_end_date = "2017-09-20"; 
//Convert them to approprariate format to be used with DatePeriod 
$get_begin = new DateTime("$get_st_date"); 
$get_end = new DateTime("$get_end_date"); 

//Add an extra day or else it will be omitted from the following process. 
$get_end = $get_end->add(new DateInterval('P1D')); 
//Count per day 
$get_interval = DateInterval::createFromDateString('1 day'); 
$get_period = new DatePeriod($get_begin, $get_interval, $get_end); 

$e_d_w_p_w = "Monday;Tuesday;"; 
$workDays = []; 
//Iteration Count 
$iter = 0; 
foreach($get_period as $get_dt) { 
    //Find if date is Saturday or Sunday. If it is, break that current loop. 
    $iter++; 
    $str_result = $get_dt->format('l'); 
    if($str_result == "Saturday") {continue;} 
    elseif($str_result == "Sunday") {continue;} 
    elseif(preg_match("($str_result)", $e_d_w_p_w)){ 
     $workDays[] = $get_dt; 
    } 
} 
var_dump($workDays); 

Demo

另外,我覺得這可能是一個有點清潔(更快,避免正則表達式只要有可能)來轉換$e_d_w_p_w到一個數組中,並檢查當前日期是該數組中:

$e_d_w_p_w = "Monday;Tuesday;"; 
$days = explode(";", $e_d_w_p_w); // transform to an array, separating by ; 
array_pop($days); // remove the last element (assuming you always have a trailing ; 

然後

elseif(in_array($str_result, $days)){ 
    $workDays[] = $get_dt; 
} 
+0

這是一個非常棒的答案,絕對是朝着正確的方向發展的! 事實證明,我的很多代碼必須被重寫,以適應這個解決方案在我的真實但是,你的答案適用於我提供的情況,而且我知道在哪裏重寫我的代碼的唯一原因就是因爲這個原因,所以非常感謝! – cmprogram

+1

這是沒有問題的,我很高興你能夠正常工作。祝你好運! – ishegg