2017-04-03 94 views
-1

假设我每个星期一和每个星期三都有办公时间。如何在php中获取下一个匹配的星期几?

我想显示“下一个办公时间:星期三”,它将自动显示与今天的日期相关的下一个即将到来的办公日。

所以,我有以下几点:

$today = date('w'); // returns 0,1,2,3.... 

$dowMap = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'); 

$officeday = 3 // Monday = 1, Wednesday = 3... 

我试着用以下来实现:

if($officeday >= $today) { 
    echo 'NEXT OFFICE HOURS: ' . $dowMap[$officeday]; 
} 

但大于周一因不大于比较不工作始终例如星期五。我如何修改这个以获得下一个即将到来的实际日期?

谢谢!

回答

1

UPDATE

$today = date('w'); // returns 0,1,2,3.... 
    $dowMap = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'); 
    $officeday = 3 ;// Monday = 1, Wednesday = 3... 
    $firstday = 1; 

    if($officeday >= $today and $today <= 5) { 
     echo 'NEXT OFFICE HOURS: ' . $dowMap[$officeday+1]; 
    } 
    else{ 
     echo 'NEXT OFFICE HOURS: ' . $dowMap[$firstday]; 
    } 

结果是当officeday范围将显示办公室一天+ 1或($ dowMap [indexNext]);其他的将在第一天显示变量$的第一天的索引。

+0

谢谢。我试图看看我可以如何使用你的例子,但办公日子每个月都会改变,所以我希望不要像星期一那样硬编码特定的日子。 – LBF

+0

您可以在数据库中保存设置办公室第一天的日期..并将您的索引第一天的职位替换为$ dowMap [1]。我更新我的答案,让我知道它是否工作。 –

+0

感谢您的更新。我会试一试,让你知道。 – LBF

0

下面是一个有趣的方式:使用一个InfiniteIterator来循环一周的日子。一旦你打了一天,是可以接受的,可以停止和返回值:

$availableOfficeHours = new class() { 
    public function __construct() 
    { 
     //For added fun, use a SplEnum! 
     $this->daysOfWeek = [ 
      'Monday', 
      'Tuesday', 
      'Wednesday', 
      'Thursday', 
      'Friday', 
      'Saturday', 
      'Sunday', 
     ]; 

     $this->daysOfWeekIterator = new InfiniteIterator(new ArrayIterator($this->daysOfWeek)); 

     $this->officeHours = [ 
      'Monday', 
      'Wednesday' 
     ]; 
    } 

    public function getNextOfficeDay($today) 
    { 
     if(!in_array($today, $this->daysOfWeek)){ 
      throw new InvalidArgumentException('$today must be a spelled out name of the week. Example: "Monday".'); 
     } 

     //Set the iterator to today... 
     while($today !== $this->daysOfWeekIterator->current()){ 
      $this->daysOfWeekIterator->next(); 
     } 

     do { 
      $this->daysOfWeekIterator->next(); 
      $day = $this->daysOfWeekIterator->current(); 
     } while(!in_array($day, $this->officeHours)); 

     return $day; 
    } 

}; 

echo $availableOfficeHours->getNextOfficeDay('Monday') . PHP_EOL; 
echo $availableOfficeHours->getNextOfficeDay('Tuesday') . PHP_EOL; 
echo $availableOfficeHours->getNextOfficeDay('Wednesday') . PHP_EOL; 
echo $availableOfficeHours->getNextOfficeDay('Thursday') . PHP_EOL; 
echo $availableOfficeHours->getNextOfficeDay('Friday') . PHP_EOL; 
echo $availableOfficeHours->getNextOfficeDay('Saturday') . PHP_EOL; 
echo $availableOfficeHours->getNextOfficeDay('Sunday') . PHP_EOL; 

//Get based on today's date: 
$today = date('l'); 
echo $availableOfficeHours->getNextOfficeDay($today) . PHP_EOL; 

输出:

Wednesday 
Wednesday 
Monday 
Monday 
Monday 
Monday 
Monday 
Wednesday 

这工作,因为一个InfiniteIterator将循环自身周围,而无需手动重置它,因此在本周晚些时候设置它可以让它旋转并在周一的第一天。这可能不是最实际的做法实践方式。我只是想玩弄InfiniteIterator。

+0

有趣!我会给这个镜头,看看它是如何运作在我的情况。 – LBF

相关问题