PHP:将事件添加到一周的工作日

时间:2011-05-02 11:44:55

标签: php

我在这方面需要帮助,而不是代码(我认为这是我的工作;)

我需要分发供应商在工作日中的一个月内必须进行的访问。 本月我有100人参观,有不同的周期性参数。

每天有25人参观一次。 25人每月访问两次 每周25人参观一次 每天有25人参观

我需要在每个月的第一天分发所有这些访问,直到本月的所有工作日,我真的不知道我该怎么办。

我认为我需要的一些数据包含下一个代码:

$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。

1 个答案:

答案 0 :(得分:1)

这只是部分答案,但如果我改写一下这个问题:

  • 如何在Y天内分发X次访问,其中每次X下降需要特定的周期(时间周期),让我们称之为p?周期为:每日,每周,每月两次和每月。 “可用天数”是指特定月份的工作日。

所以你需要知道一些事情作为问题的输入:

  • 计算的数据是哪个月? (月份有不同的长度)
  • 这个月的哪几天是“工作”日?
  • “访问”X需要多长时间(或更重要的是,某一天可以发生多少次X)?

假设您知道您正在计算的月份,您上面的逻辑提供了一种获取特定月份日期的方法。工作日也是计算的。您需要知道(或获得)可以适合一天的访问次数;如果没有此约束,您将无法“安排”访问。这是我将遵循的逻辑(松散地):

获取可用天数

  1. 获取计算月份
  2. 获取识别“工作”日的规则
  3. 使用月份获取所有可用日期,然后使用#2中的规则确定工作日
  4. 创建一个仅包含工作日的新列表
  5. 到目前为止一直很好 - 我们有一个“可用日期”的离散列表;现在我们来看一下可能的劳动力分配算法。

    获取所需的访问次数

    1. 按周期等级获取每次访问次数(例如每天25次,每周25次,每两次25次,每月25次)
    2. 获取每天(广告位)允许的最大“访问次数”
    3. 从最高频率到最低频率,开始分发访问
    4. 如果一天已满,请检查第二天或提出错误(抛出异常)
    5. 希望#5和#6显而易见,但我会稍微解释#7 ......如果你想分配访问次数,并假设所有访问都具有相同的优先级,那么一种方法就是从最高频率,然后向后工作到最低。如果您每天都有访问,那么先将它们分散出去,然后再分为每周一次,然后是每两周一次,然后是每月一次。每个周期都有一组不同的约束,因此隔离逻辑可能是有意义的。粗略的想法是:

      每日

      • 完成每个可用日期,每天为每个X添加一次类型访问
      • 如果一天用完了空格(插槽),则会引发错误

      <强>每周

      • 确定每个可用日期的周会员资格
      • 每周一次
        • 检查第一天是否有空格
        • 如果是这样,请添加适合
        • 的X次访问
        • 如果访问X&gt;空格然后移动到第二天并继续尝试分配X
        • 的成员
        • 如果您用完了几天但仍然有X,那么就会出现错误

      Bi每月

      • 获取可用日期列表
      • 检查第一天是否有空格
      • 如果是这样,请添加适合
      • 的X次访问
      • 如果访问X&gt;空格然后移动到第二天并继续尝试分配X
      • 的成员
      • 如果您用完了几天但仍然有X,那么就会出现错误
      • 重复此过程,但现在您需要确保第二次访问与原始日期的同一个月相同

      <强>每月

      • 实际上与每周相同,只需要为整个月分配一次访问。

      ...

      根据您的目的,仍有一些问题需要解决......

      • 确定一天中可以进行的访问次数(插槽)
      • 确定所有访问是否具有相同的价值,或者某些访问是否比其他访问更重要。如果它们不同,那么您应该将算法更改为首先分配高优先级访问,然后降低。
      • 没有为旅行时间提供住宿(旅游推销员问题)
      • 有一个隐含的假设,即只有一个人可以进行访问...如果你有多个人在进行访问,那么你需要分配他们的时间来想出有多少个可用的插槽在某一天
      • 与所有访问目前被视为平等的方式相同,没有考虑访问者或被访问者的性质(被访问的人/企业)..如果访问者与访问者有特定的关系考虑到你需要添加这个

      只是一些想法。希望这会有所帮助。