2012-10-10 38 views
0

我目前在PHP中有2個日期 - '開始'日期和'結束'日期。然後我使用我發現的名爲createDateRangeArray$date_range)的函數創建了一個日期數組。爲了簡單起見,結束日期將始終爲今天的日期PHP - 查找最長日期「streak」和「slump」

我也有一個單獨的數組,其中包含一組日期($valid_dates),這些日期將始終落在上述開始和結束日期之間。在這些日子裏,發生了一些事情 - 在這種情況下,是一個培訓課程。

我試圖讓我的頭周圍發現了以下:

  • 日期範圍類似$date_range陣列組成,TRUE或FALSE填充基於與否培訓課程發生在該日期。我很高興這是一個名爲date的密鑰的關聯數組,也就是說,session_found(布爾)。
  • 最長的「連勝」,即培訓課程發生的最長連續天數。
  • 最長的「坍塌」,即培訓課程沒有發生的最長連續天數。

有人能指出我在爲獲得上述信息,而無需使用上$date_range陣列的內容foreach,然後不得不使用其他foreach$valid_dates陣列上的每個項目$date_range陣列在正確的方向?這是非常低效的...

對不起,如果我已經過度複雜的事情與所有的信息,但任何幫助將不勝感激。

我目前在Debian Wheezy上使用PHP 5.4,如果有幫助的話(典型的LAMP堆棧)。

感謝

回答

3

這是完全未經測試,但如何像下面這樣:

你應該得到的最長連勝,衰退的結束日期,以及有多少它花費數天。 $會話將包含以日期爲關鍵字的數組,在有會話的日子中爲true,在沒有日期的情況下爲false。

仍然是一個foreach,但我不認爲你可以避免使用一個。讓我知道它是否有效,我真的不知道這段代碼的行爲有多好,但希望能給你一個出發點?

$streak = 0; 
$slump = 0; 
$longeststreak = 0; 
$longestslump = 0; 
$longeststreakend = 0; 
$longestslumpend = 0; 

foreach ($date_range as $date) { 
    if (in_array($date, $valid_date)) { 
     $sessions[$date] = true; 
     $streak++; 

     // Slump broken, record the length if it beat the previous record 
     if ($longestslump < $slump) { 
      $longestslump = $slump; 
      $longestslumpend = $date; 
     } 

     $slump=0; 
    } 
    else { 
     $sessions[$date] = false; 
     $slump++; 

     // Streak broken, record the length if it beat the previous record 
     if ($longeststreak < $streak) { 
      $longeststreak = $streak; 
      $longeststreakend = $date; 
     } 

     $streak=0; 
    } 
} 
+0

這讓我走上了正軌。乾杯! :) – digitalformula