Создано время выполнения для отображения двухнедельных дат
<?php $date1 = "07/05/2013"; $date2 = date('M j, Y', strtotime($date1 . " + 14 day")); $date3 = date('M j, Y', strtotime($date2 . " + 14 day")); $date4 = date('M j, Y', strtotime($date3 . " + 14 day")); $date5 = date('M j, Y', strtotime($date4 . " + 14 day")); $date6 = date('M j, Y', strtotime($date5 . " + 14 day")); $date7 = date('M j, Y', strtotime($date6 . " + 14 day")); $date8 = date('M j, Y', strtotime($date7 . " + 14 day")); $date9 = date('M j, Y', strtotime($date8 . " + 14 day")); $date10 = date('M j, Y', strtotime($date9 . " + 14 day")); $date11 = date('M j, Y', strtotime($date10 . " + 14 day")); $date12 = date('M j, Y', strtotime($date11 . " + 14 day")); $date13 = date('M j, Y', strtotime($date12 . " + 14 day")); $date14 = date('M j, Y', strtotime($date13 . " + 14 day")); $date15 = date('M j, Y', strtotime($date14 . " + 14 day")); $date16 = date('M j, Y', strtotime($date15 . " + 14 day")); $date17 = date('M j, Y', strtotime($date16 . " + 14 day")); $date18 = date('M j, Y', strtotime($date17 . " + 14 day")); ?>
Как я могу собрать его вместе по месяцам? Скажем, я хочу знать, сколько дат приземляется в августе или декабре. Также, если бы я хотел получить количество дат до конца года? Помощь будет с благодарностью оценена.
Я не был уверен точно, что вы имели в виду для группировки по месяцам, но это будет использовать массив, чтобы объявить все даты, и вы можете изменить переменную $ limit, чтобы увеличить или уменьшить количество дат. изменить $ даты, чтобы скорректировать исходную дату. $ left – сколько дней осталось в массиве (оно срабатывает после первого дня, может быть изменено на триггер в последний день), а $ amount – количество дат в августе
<?php $limit = 17; $dates = array("07-05-2013"); for ($i=1; $i<=$limit; $i++){ $dates[$i]=date('dm-Y', strtotime($dates[$i-1] . "+ 14 days")); } foreach (array_keys($dates) as $key){ $value = date('m', strtotime($dates[$key])); if ($value == "08"){ $amount = $amount + 1; } if ($amount == 1){ $left = $limit-$key; } } print_r ($dates); echo "<br>"; echo $amount . "<br>" . $left; ?>
Попробуй это:
<?php // initiate months $month_arr = Array(); for ($i=1; $i<=12; $i++){ // no. of dates $month_arr[$i] = 0; } $date_arr = Array(); $date_start = "07/05/2013"; $date_arr[] = date('M j, Y', strtotime($date_start)); for ($i=1; $i<=17; $i++){ $date_temp = date('M j, Y', strtotime($date_arr[$i-1] . " + 14 day")); $month = date('n', strtotime($date_temp)); $month_arr[$month] += 1; $date_arr[] = $date_temp; } foreach ($month_arr as $k => $v){ echo "<BR>Month: " . $k . ", No. of dates: " . $v; } // all dates echo "<BR>All dates<BR>"; var_dump ($date_arr); ?>
Вы можете расширить эту логику, чтобы группировать фактические даты по месяцам, а не получать только количество дат в месяц. Это решение для этого:
<?php // initiate months $month_arr = Array( 'January' => Array('num_dates'=>0, 'dates'=>Array()) , 'February' => Array('num_dates'=>0, 'dates'=>Array()), 'March' => Array('num_dates'=>0, 'dates'=>Array()), 'April' => Array('num_dates'=>0, 'dates'=>Array()), 'May' => Array('num_dates'=>0, 'dates'=>Array()), 'June' => Array('num_dates'=>0, 'dates'=>Array()), 'July' => Array('num_dates'=>0, 'dates'=>Array()), 'August' => Array('num_dates'=>0, 'dates'=>Array()), 'September' => Array('num_dates'=>0, 'dates'=>Array()), 'October' => Array('num_dates'=>0, 'dates'=>Array()), 'November' => Array('num_dates'=>0, 'dates'=>Array()), 'December' => Array('num_dates'=>0, 'dates'=>Array()) ); $date_arr = Array(); $date_start = "07/05/2013"; $date_arr[] = date('M j, Y', strtotime($date_start)); for ($i=1; $i<=17; $i++){ $date_temp = date('M j, Y', strtotime($date_arr[$i-1] . " + 14 day")); $month = date('F', strtotime($date_temp)); $month_arr[$month]['dates'][] = $date_temp; $month_arr[$month]['num_dates'] += 1; $date_arr[] = $date_temp; } foreach ($month_arr as $k => $v){ if (!empty($v)){ if ($v['num_dates'] != 0){ echo "<BR><BR>Month: " . $k; echo "<BR>No. of dates: " . $v['num_dates']; foreach ($v['dates'] as $k1=>$v1){ echo "<BR>" . $v1; } } } } ?>
На данный момент в $ month_arr должно быть все, что вам нужно.
просто добавьте оператор if и увеличивайте все 12 месяцев … если месяцы совпадают
$n=1; $month=array();//dumpyour dates in an array $date=array() while($k<30){ if (date('n', strtotime($date[$k]))==date('n', strtotime($date[$k-1])){ echo $date[$k++]; $m = date('n', strtotime($date[$k])); $month[$m]=++$n; } else{ ..... } }
в$n=1; $month=array();//dumpyour dates in an array $date=array() while($k<30){ if (date('n', strtotime($date[$k]))==date('n', strtotime($date[$k-1])){ echo $date[$k++]; $m = date('n', strtotime($date[$k])); $month[$m]=++$n; } else{ ..... } }
Поскольку я продолжаю повторную итерацию на SO, классы DateTime PHP делают большинство операций datetime тривиальными.
Ваш вопрос не на 100% ясен, но из ваших комментариев кажется, что вам нужен массив временных меток, разделенных на месяц на 14 дней. Я не знаю, считали ли вы, что месяцы могут пересекать летние кабалы, но я принял это во внимание в своем ответе.
Код ниже должен делать то, что вы хотите: –
$start = \DateTime::createFromFormat('d/m/Y', '07/05/2013'); $interval = new \DateInterval('P14D'); $periods = new \DatePeriod($start, $interval, 26); $dates = array(); foreach($periods as $day){ /** @var \DateTime $day */ $dates[$day->format('Y')][$day->format('M')][] = $day->getTimestamp(); } var_dump($dates);
Вывод:-
array (size=2) 2013 => array (size=8) 'May' => array (size=2) 0 => int 1367936286 1 => int 1369145886 'Jun' => array (size=2) 0 => int 1370355486 1 => int 1371565086 'Jul' => array (size=3) 0 => int 1372774686 1 => int 1373984286 2 => int 1375193886 'Aug' => array (size=2) 0 => int 1376403486 1 => int 1377613086 'Sep' => array (size=2) 0 => int 1378822686 1 => int 1380032286 'Oct' => array (size=2) 0 => int 1381241886 1 => int 1382451486 'Nov' => array (size=2) 0 => int 1383664686 1 => int 1384874286 'Dec' => array (size=3) 0 => int 1386083886 1 => int 1387293486 2 => int 1388503086 2014 => array (size=5) 'Jan' => array (size=2) 0 => int 1389712686 1 => int 1390922286 'Feb' => array (size=2) 0 => int 1392131886 1 => int 1393341486 'Mar' => array (size=2) 0 => int 1394551086 1 => int 1395760686 'Apr' => array (size=2) 0 => int 1396966686 1 => int 1398176286 'May' => array (size=1) 0 => int 1399385886
Я бы рекомендовал, чтобы вместо массива временных меток у вас был массив объектов DateTime, тогда вы можете манипулировать каждым, как хотите. В этом случае код будет выглядеть так:
$start = \DateTime::createFromFormat('d/m/Y', '07/05/2013'); $interval = new \DateInterval('P14D'); $periods = new \DatePeriod($start, $interval, 26); $dates = array(); foreach($periods as $day){ /** @var \DateTime $day */ $dates[$day->format('Y')][$day->format('M')][] = $day; }