Получение дополнительного 1 в календаре месяца января

function getDates($year){

$dates = array();

for($i = 1; $i <= 366; $i++){
$month = date('m', mktime(0,0,0,1,$i,$year)); // outputs month 01 for jan etc
$wk = date('W', mktime(0,0,0,1,$i,$year)); // this outputs 01 if 1st week etc
$wkDay = date('D', mktime(0,0,0,1,$i,$year)); //weekday eg mon ,sun etc
echo $day = date('d', mktime(0,0,0,1,$i,$year)); // outputs day eg 01,13,23 etc

$dates[$month][$wk][$wkDay] = $day;  // storing date in array
}

return $dates;
}

$dates = getDates(2014);

echo '<br/>'.$dates['01']['01']['Wed']; // getting 01
echo '<br/>'.$dates['01']['01']['Thu']; // 01 (should get 02 as it is 2nd jan thu in 2014)
echo '<br/>'.$dates['01']['01']['Fri']; // 03

когда я повторяю $ day в цикле, я получаю 01 02 03 04 и т. д., что правильно, но когда я повторяю то же самое в массиве $ date выше, я получаю 01 как для 1-го месяца, 1-й недели среды, так и для 1-го месяца 1-й недели четверга. Зачем? Где я не прав? Все остальные даты, которые я получаю за 2014 год, верны.

0

Решение

@ymas прав. Поскольку в 2014 году вы используете 366 дней, число 366 — это первый день в 2015 году. В результате в первый день 2015 года значение в текущем массиве будет перезаписано. Исправьте это, проверив количество дней в году и используйте это значение вместо статического 366. Это будет примерно так:

function getDates($year){

$dates = array();

$daysInYear = date("z", mktime(0,0,0,12,31,$year)) + 1;
for($i = 1; $i <= $daysInYear; $i++){

$month = date('m', mktime(0,0,0,1,$i,$year)); // outputs month 01 for jan etc
$wk = date('W', mktime(0,0,0,1,$i,$year)); // this outputs 01 if 1st week etc
$wkDay = date('D', mktime(0,0,0,1,$i,$year)); //weekday eg mon ,sun etc
echo $day = date('d', mktime(0,0,0,1,$i,$year)); // outputs day eg 01,13,23 etc
$dates[$month][$wk][$wkDay] = $day;  // storing date in array
}
return $dates;
}

Обратите внимание, что вы не должны использовать 365 в качестве статического значения, потому что тогда 31 декабря не будет доступно в високосный год.

2

Другие решения

Я бы порекомендовал использовать DateTime Объект для этого:

    function newGetDates($year) {
$start = new DateTime("$year-01-01");
$end = new DateTime("$year-12-31 23:59");

$period = new DatePeriod($start, new DateInterval('P1D'), $end);
$dates = array();

foreach($period as $day) {
$dates[$day->format('m')][$day->format('W')][$day->format('D')]
= $day->format('d');
}

return $dates;
}
1

Вы генерируете ту же временную метку 4x в цикле, что является избыточным. Сохраните отметку времени в переменной, а затем вызовите date() функция с этой переменной: Смотри как.

Еще лучше, быстрее и с меньшим потреблением памяти будет решение использовать DateTime, как это:

function getDates($year) {
$dt = new DateTime("$year-01-01");
while ($year == $dt->format('Y')) {
$dates[$dt->format('m')][$dt->format('W')][$dt->format('D')] = $dt->format('d');
$dt->modify('+1 day');
}
return $dates;
}

демонстрация

1
По вопросам рекламы [email protected]