Получить диапазон дат между двумя датами, исключая выходные

Учитывая следующие даты:

6/30/2010 - 7/6/2010 

и статическая переменная:

 $h = 7.5 

Мне нужно создать массив вроде:

 Array ( [2010-06-30] => 7.5 [2010-07-01] => 7.5 => [2010-07-02] => 7.5 => [2010-07-05] => 7.5 => [2010-07-06] => 7.5) 

Выходные дни исключены.

Нет, это не домашнее задание … по какой-то причине я просто не могу думать прямо сегодня.

Для PHP> = 5.3.0 используйте класс DatePeriod . К сожалению, он едва документирован.

 $start = new DateTime('6/30/2010'); $end = new DateTime('7/6/2010'); $oneday = new DateInterval("P1D"); $days = array(); $data = "7.5"; /* Iterate from $start up to $end+1 day, one day in each iteration. We add one day to the $end date, because the DatePeriod only iterates up to, not including, the end date. */ foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day) { $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */ if($day_num < 6) { /* weekday */ $days[$day->format("Ymd")] = $data; } } print_r($days); 

Простейший метод:

 $start = strtotime('6/30/2010'); $end = strtotime('7/6/2010'); $result = array(); while ($start <= $end) { if (date('N', $start) <= 5) { $current = date('m/d/Y', $start); $result[$current] = 7.5; } $start += 86400; } print_r($result); 

ОБНОВЛЕНИЕ: Забыли пропустить выходные. Это должно работать сейчас.

Это ответ gnud, но как функция (также добавлена ​​возможность исключить текущий день из расчета):

(примеры ниже)

 public function getNumberOfDays($startDate, $endDate, $hoursPerDay="7.5", $excludeToday=true) { // d/m/Y $start = new DateTime($startDate); $end = new DateTime($endDate); $oneday = new DateInterval("P1D"); $days = array(); /* Iterate from $start up to $end+1 day, one day in each iteration. We add one day to the $end date, because the DatePeriod only iterates up to, not including, the end date. */ foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day) { $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */ if($day_num < 6) { /* weekday */ $days[$day->format("Ymd")] = $hoursPerDay; } } if ($excludeToday) array_pop ($days); return $days; } 

И использовать его:

 $date1 = "2012-01-12"; $date2 = date('Ym-d'); //today's date $daysArray = getNumberOfDays($date1, $date2); echo 'hours: ' . array_sum($daysArray); echo 'days: ' . count($daysArray); 

Это подход ООП, на всякий случай. Он возвращает массив со всеми датами, кроме выходных дней.

  class Date{ public function getIntervalBetweenTwoDates($startDate, $endDate){ $period = new DatePeriod( new DateTime($startDate), new DateInterval('P1D'), new DateTime($endDate) ); $all_days = array();$i = 0; foreach($period as $date) { if ($this->isWeekend($date->format('Ym-d'))){ $all_days[$i] = $date->format('Ym-d'); $i++; } } return $all_days; } public function isWeekend($date) { $weekDay = date('w', strtotime($date)); if (($weekDay == 0 || $weekDay == 6)){ return false; }else{ return true; } } } $d = new Date(); var_dump($d->getIntervalBetweenTwoDates('2015-08-01','2015-08-08'));