2014-09-22 65 views
1

內的所有可能的日期組合我有兩個日期,這是事件的開始日期和結束日期,在我的PHP腳本我想找出這兩個日期PHP查找間隔

之間我的意思是我日期的所有可能的組合要找出所有可能的天參與者來一個事件,

假設開始日期IN20/10/2014年和結束日期is23/10/2014,

所有可能的組合是

  1. 20/10/2014 -23/10/2014
  2. 20/10/2014 -22/10/2014
  3. 20/10/2014 -21/10/2014
  4. 21/10/2014 -23 /二千零十四分之十
  5. 21/10/2014 -22/10/2014
  6. 22/10/2014 -23/10/2014
  7. 20/10/2014 -21/10/2014- 22/10/2014
  8. 20/10/2014 -21/10/2014- 22/10/2014 -23/10/2014
  9. 21/10/2014 -22/10/2014 -23/10/2014

我想找出所有可能的組合的原因是,我有基於活動參與者日會話的不同折扣選項。

+0

你應該使用不同的列'開始date'和'結束date'在表 – Manwal 2014-09-22 09:16:55

+0

讓我們瞭解您已經做了 – niyou 2014-09-22 09:28:52

+0

怎麼了用簡單的複選框:第1天,第2天等?單日參與情況如何?或者例如20/10/2014和23/10/2014(跳過一兩天)? – 2014-09-22 11:12:44

回答

3

這個問題可以在兩個部分被分解:

  1. 對於任何兩個日期,創建具有所有落入日期間隔內的天的陣列。
  2. 創建所有可能天數的所有可能組合(從1到n,其中n ==間隔內的天數)。

對於第一部分,我將使用DatePeriod PHP類,併爲第二個Math_Combinatorics PEAR包。下面是完整的代碼:

require_once 'Math/Combinatorics.php'; 

date_default_timezone_set('UTC'); 

$format = "d/m/Y"; 
$start = DateTime::createFromFormat($format, "20/10/2014"); 
$end = DateTime::createFromFormat($format, "23/10/2014"); 

$period = new DatePeriod($start, new DateInterval('P1D'), $end); 

$dates = array(); 
foreach ($period as $date) { 
    $dates[] = $date->format($format); 
} 

$dates[] = $end->format($format); 

$combinations = array(); 
$combinatorics = new Math_Combinatorics(); 

foreach (range(1, count($dates)) as $number_of_combinations) { 
    foreach ($combinatorics->combinations($dates, $number_of_combinations) as $combination) { 
     $combinations[] = $combination; 
    } 
} 

print_r($combinations); 

結果:

Array 
(
    [0] => Array 
     (
      [0] => 20/10/2014 
     ) 

    [1] => Array 
     (
      [0] => 21/10/2014 
     ) 

    [2] => Array 
     (
      [0] => 22/10/2014 
     ) 

    [3] => Array 
     (
      [0] => 23/10/2014 
     ) 

    [4] => Array 
     (
      [0] => 20/10/2014 
      [1] => 21/10/2014 
     ) 

    [5] => Array 
     (
      [0] => 20/10/2014 
      [2] => 22/10/2014 
     ) 

    [6] => Array 
     (
      [0] => 20/10/2014 
      [3] => 23/10/2014 
     ) 

    [7] => Array 
     (
      [1] => 21/10/2014 
      [2] => 22/10/2014 
     ) 

    [8] => Array 
     (
      [1] => 21/10/2014 
      [3] => 23/10/2014 
     ) 

    [9] => Array 
     (
      [2] => 22/10/2014 
      [3] => 23/10/2014 
     ) 

    [10] => Array 
     (
      [0] => 20/10/2014 
      [1] => 21/10/2014 
      [2] => 22/10/2014 
     ) 

    [11] => Array 
     (
      [0] => 20/10/2014 
      [1] => 21/10/2014 
      [3] => 23/10/2014 
     ) 

    [12] => Array 
     (
      [0] => 20/10/2014 
      [2] => 22/10/2014 
      [3] => 23/10/2014 
     ) 

    [13] => Array 
     (
      [1] => 21/10/2014 
      [2] => 22/10/2014 
      [3] => 23/10/2014 
     ) 

    [14] => Array 
     (
      [0] => 20/10/2014 
      [1] => 21/10/2014 
      [2] => 22/10/2014 
      [3] => 23/10/2014 
     ) 

)