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 год, верны.
@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 декабря не будет доступно в високосный год.
Я бы порекомендовал использовать 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;
}
Вы генерируете ту же временную метку 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;
}