2017-04-03 14 views
-1

私は毎週月曜日と毎週水曜日に就業時間があるとしましょう。PHPの次の一致する曜日を取得するには?

"NEXT OFFICE HOURS:Wednesday"を表示して、今日の日付に関連して次の営業日を自動的に表示したいとします。

$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〕)所に表示されたときです。 他の人は、変数firstdayにインデックスfirstdayを表示します。

+0

ありがとうございました。私はあなたの例をどのように使うことができるか見てみたいと思っていますが、オフィスの日は毎月変わるので、月曜日のような特定の日をハードコードしないことを望んでいました。 – LBF

+0

あなたの就業日の最初の日を設定するためにDBに保存することができます。$ 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

関連する問題