2011-05-02 311 views
2

我需要幫助的方式這樣做,而不是代碼(THA是我的工作,我認爲;))PHP:添加事件到一個星期的工作日

我需要分發的訪問的供應商必須做在工作日的一個月內。 本月我有100人蔘觀,有不同的定期參數。

25人每月訪問一次。 25人,每月兩次參觀 25人每週一次參觀 25人每天

我需要分發每月的第一天,所有這些訪問參觀,throught該月的所有工作日和我真的不知道我該怎麼辦。

我得到的一些數據我想我需要下一個代碼:

$days_this_month = date("d",mktime(0,0,0,$month+1,0,$year)); 


function weeks_this_month($year, $month, $start = 0) { 
$unix = strtotime ("$year-$month-01"); 
$numDays = date ('t', $unix); 
if ($start === 0) { 
    $dayOne = date ('w', $unix); // Based on 0-6 
} else { 
    $dayOne = date ('N', $unix); //based on 1-7 
    $dayOne --; //convert for 0 based weeks 
} 

//if day one is not the start of the week then advance to start 
$numWeeks = floor (($numDays - (6 - $dayOne))/7); 
return $numWeeks; 
} 
$weeks_this_month = weeks_this_month($year, $month); 

我也得到了天,每週有:

$weekArray = array(); 

// set current date1 
$date = date("m/d/Y"); //'05/09/2011'; 
$date = "05/11/2011"; //'05/09/2011'; 

// parse about any English textual datetime description into a Unix timestamp 
$ts = strtotime($date); 

// calculate the number of days since Monday 
$dow = date('w', $ts); 
$offset = $dow - 1; 
if ($offset < 0) $offset = 6; 

// calculate timestamp for the Monday 
$ts = $ts - $offset*86400; 

// loop from Monday till Sunday 
for ($i=0; $i<7; $i++, $ts+=86400){ 
    $temp_date = date("Y-m-d", $ts); // here I set it to the same format as my database 
    array_push($weekArray, $temp_date); 
} 

print_r ($weekArray); 

隨着當前結果:

[0] => 2011-05-09 
[1] => 2011-05-10 
[2] => 2011-05-11 
[3] => 2011-05-12 
[4] => 2011-05-13 
[5] => 2011-05-14 
[6] => 2011-05-15 

而我的最後一張支票是一個函數,用於瞭解結果日期是否爲工作日,而不是週六或週日。

問題是我真的迷路了。

我不知道如何混合所有這些信息來分發供應商訪問。

任何人都可以給我一個想法嗎?

真的thnx。

+0

你可以進一步解釋一下,你究竟在做什麼? – Yoshi 2011-05-02 11:52:25

+0

嗨,你好,我試圖解釋更好的編輯帖子。日Thnx! – SauronZ 2011-05-02 12:01:23

+0

「拜訪」你的意思是供應商必須去某個地方?你想計算什麼供應商必須訪問誰? – Yoshi 2011-05-02 13:08:14

回答

1

這只是局部的答案,但如果我改一下這個問題:

  • 我怎麼能分佈在y日,其中每個X時需要特定的週期(時間週期)X探訪,讓叫它p +週期性是:每日,每週,每月兩次和每月。 「可用日期」是特定月份的工作日。

所以一些你需要知道作爲輸入的問題的事物:

  • 這一個月的數據來計算? (月有不同的長度)
  • 本月的哪幾天是「工作」日?
  • 「參觀」X需要多長時間(或更重要的是,某一天可以進行多少次X)?

假設你知道你正在計算哪個月,上面的邏輯提供了一種獲取特定月份日期的方法。工作日也計算在內。你需要知道(或得到)可以適應一天的訪問次數;沒有這個限制,你將無法「安排」訪問。這是我將遵循(寬鬆)的邏輯:

獲取可用天

  1. 獲得一個月來計算
  2. 獲取規則確定的「工作」幾天
  3. 使用每月能拿到所有可用天數,然後#2中的規則確定工作日
  4. 創建一個僅包含工作日的新列表

到目前爲止這麼好 - 我們已經有了一個離散的「可用天數」列表;現在我們看看可能的勞動力分配算法。

獲取所需訪問

  1. 獲得通過週期性類的每個訪問次數(例如,25每天,25周,25雙月,25月)
  2. 獲得「訪問的最大數量「每天允許的(槽)
  3. 從最高頻率到最低工作,開始訪問分佈
  4. 如果一天是飽的,請在第二天或拋出一個錯誤(拋出一個異常)

希望#5和#6會很明顯,但我會解釋一下#7 ...如果你想分配訪問,並假設所有訪問都是同等重要的,那麼一種方法是開始頻率最高,然後倒退到最低。如果你有每日訪問,那麼先分開,然後是每週,然後是雙週,然後是每月。每個週期性都有一組不同的約束條件,因此可能有必要分離邏輯。粗糙的想法是:

日報

  • 通過每個可用天工作,每天都在添加類型的一個訪問每個X
  • 如果一天用完的空間(插槽),然後引發錯誤

週刊

  • 識別星期成員每個可用天
  • 對於每個星期
    • 檢查第一天看到它有任何空間
    • 如果是這樣,加上X作爲多次訪問,這將適合
    • 如果訪問X>空格,然後移動到第二天繼續嘗試分配X
    • 的成員如果你用完了幾天,仍然有X的剩餘隨後引發錯誤

碧月

  • 獲取可用天名單
  • 入住的第一天看到它有任何空間
  • 如果是這樣,加上X作爲多次訪問,這將適合
  • 如果訪問X>空格,然後移動到第二天並繼續嘗試分配X的成員
  • 如果您用完日期並且仍然剩餘X,則會引發錯誤
  • 重複上述過程,但現在你需要確保第二次訪問屬於同月的某一天比原來

每月

  • 實際上是相同的每週其它,只有你只需要爲整個月分配一次訪問。

...

有一些問題仍留有需要解決,這取決於你的目的......

  • 確定有多少人訪問能在一天(槽)進行
  • 確定所有訪問是否具有相同的價值,或者是否有某些訪問比其他訪問更重要。如果它們不同,那麼你應該改變算法首先分配高優先級訪問,然後降低。
  • 有沒有適合旅行時間的訪問(la旅行商問題)
  • 有一個隱含的假設,只有一個人可以做訪問......如果你有多個人在進行訪問,那麼你需要分配他們的時間來想出一個給定日期內有多少個插槽可用的想法
  • 以同樣的方式,所有訪問當前被視爲相等,那裏沒有考慮到訪問者或被訪者(被訪問的人/商業)的性質。如果有被訪問者被訪問者的具體關係需要考慮,那麼你將需要添加這個

只是一個想法很少。希望這可以幫助。

相關問題