2011-05-02 328 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旅行商问题)
  • 有一个隐含的假设,只有一个人可以做访问......如果你有多个人在进行访问,那么你需要分配他们的时间来想出一个给定日期内有多少个插槽可用的想法
  • 以同样的方式,所有访问当前被视为相等,那里没有考虑到访问者或被访者(被访问的人/商业)的性质。如果有被访问者被访问者的具体关系需要考虑,那么你将需要添加这个

只是一个想法很少。希望这可以帮助。

相关问题