php
  • date
  • range
  • 2016-12-13 203 views 0 likes 
    0

    我試圖混合幾個php函數來獲取多個日期範圍之間的所有日期。返回多個日期範圍之間的所有日期

    首先,我使用的功能:

    public function getDatesForArray($id){ 
         return $this->sqlQuery("SELECT date_from, date_to FROM bn_prereservation WHERE 
         oid='".$id."' AND status='ACCEPT' ORDER BY date_from ASC"); 
    } 
    

    從我的數據庫獲取所有數據範圍。而我得到這樣的:

    Array 
    (
    [0] => Array 
        (
         [date_from] => 2016-12-05 
         [date_to] => 2016-12-08 
        ) 
    
    [1] => Array 
        (
         [date_from] => 2016-12-11 
         [date_to] => 2016-12-13 
        ) 
    ) 
    

    而接下來,我用第二個函數之間的數據範圍至極應該返回所有日期:

    public function getReserv2($id){ 
         $dates = $this->getDatesforArray($id); 
         $array = array(); 
    
         foreach($dates as list($start, $end)) { 
          $format = 'Y-m-d'; 
          $interval = new DateInterval('P1D'); 
          $realStart = new DateTime($start); 
          $realEnd = new DateTime($end); 
          $realEnd->add($interval); 
    
    
          $period = new DatePeriod($realStart, $interval, ($realEnd)); 
    
          foreach($period as $date) { 
           $array[] = $date->format($format); 
          } 
         } 
         return $array; 
    } 
    

    我想到,我得到這樣的:

    2016-12-05 
    2016-12-06 
    2016-12-07 
    2016-12-08 
    2016-12-11 
    2016-12-12 
    2016-12-13 
    

    但我只得到:

    2016-12-13 
    2016-12-13 
    

    任何想法?

    +0

    'list'的問題/錯誤在這裏。我會給你寫一個答案。 – Jeff

    回答

    0

    Docs

    列表()只適用於數字數組並假定數字索引從0開始。

    你在這裏嘗試「提取」關聯數組:

    foreach($dates as list($start, $end)) 
    

    產生E_NOTICE未定義偏移
    (我想你已經變成那關)

    所以要解決你的問題做:

    function getReserv2($id){ 
        $dates = $this->getDatesforArray($id); 
        $array = array(); 
    
        foreach($dates as $d) { 
        // print_r($d); 
        // list($start, $end) = $d; // THIS WONT WORK 
         $format = 'Y-m-d'; 
         $interval = new DateInterval('P1D'); 
         $realStart = new DateTime($d['date_from']); // get it directly from the array here 
         $realEnd = new DateTime($d['date_to']); 
         $realEnd->add($interval); 
    
         $period = new DatePeriod($realStart, $interval, ($realEnd)); 
    
         foreach($period as $date) { 
          $array[] = $date->format($format); 
         } 
        } 
        return $array; 
    } 
    

    結果:

    array(7) { 
        [0]=> 
        string(10) "2016-12-05" 
        [1]=> 
        string(10) "2016-12-06" 
        [2]=> 
        string(10) "2016-12-07" 
        [3]=> 
        string(10) "2016-12-08" 
        [4]=> 
        string(10) "2016-12-11" 
        [5]=> 
        string(10) "2016-12-12" 
        [6]=> 
        string(10) "2016-12-13" 
    } 
    
    +0

    對我而言,它在$ d後有效。[]我用雙引號。例如$ d。[「date_from」]。但是,我做了這個小改動後,它的作品完美。謝謝。 –

    +0

    不客氣!是的,如果你在那裏使用雙引號或單引號,那沒有什麼區別,我只是習慣在那裏單打。 – Jeff

    +0

    如果它適合你,你可以接受這個答案。 – Jeff

    相關問題