Intereting Posts
php-переменная в html нет другого пути: <? php echo $ var; ?> Чтение изображения извне public_html с помощью PHP? Ошибка анализа: ошибка синтаксиса, неожиданный T_STRING 59 Наиболее распространенный / любимый синтаксис для документации внутри кода (комментарии)? Преобразование HTML + CSS в PDF с помощью PHP? TransformationFailedException после обновления PHP 5.6.26 до 5.6.27 Плагин с открытым исходным кодом для обмена ссылками, такими как Addthis? FLASH as3 не может идентифицировать веб-адрес localhost php Вывод всех ошибок PHP в базу данных not error_log Ошибка «Запрещенный ключевой символ» в CodeIgniter? Карты Google – панорамирование и масштабирование по областям – маркеры не появляются при увеличении или панорамировании – ПОМОЩЬ! Как создать динамический массив Каков максимальный размер ключа для массива в PHP? как добавить ссылку на страницу PHP на мой нижний колонтитул в wordpress Ошибка сеанса после перезагрузки страницы

Группировка дат в месяцах в php

Создано время выполнения для отображения двухнедельных дат

<?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; }