Речь идет о заполнении массива праздничными днями для определенного года (а не о том, как их рассчитать), чтобы впоследствии легко получить к ним доступ. Мой подход заключается в использовании меток времени праздников в качестве ключей.
$year = 2015;
$holidays = array(
strtotime($year . '-01-01') => array(
'holiday' => 'New Year',
'comment' => 'Happy New Year!'
),
strtotime($year . '-04-05') => array(
'holiday' => 'Easter',
'comment' => 'Happy Easter!'
),
strtotime($year . '-12-25') => array(
'holiday' => 'Christmas',
'comment' => 'Merry Christmas!'
)
.
.
.
);
Это работает нормально до тех пор, пока в один и тот же день не будет более одного праздника, например 6 декабря 2015 г. (День Святого Николая, Первое пришествие). В этом случае значение за уже определенным ключом перезаписывается. Так что нужен еще один уровень массива.
$year = 2015;
$holidays = array();
$holidays[strtotime($year . '-01-01')][] => array(
'holiday' => 'New Year',
'comment' => 'Happy New Year!'
);
$holidays[strtotime($year . '-04-05')][] => array(
'holiday' => 'Easter',
'comment' => 'Happy Easter!'
);
$holidays[strtotime($year . '-12-25')][] => array(
'holiday' => 'Christmas',
'comment' => 'Merry Christmas!'
);
$holidays[strtotime($year . '-12-06')][] => array(
'holiday' => 'St Nicholas\' Day',
'comment' => 'Make sure to turn out your boots!'
);
$holidays[strtotime($year . '-12-06')][] => array(
'holiday' => 'First Advent',
'comment' => 'Remember to light the first candle on your Advent wreath!'
);
.
.
.
);
Может ли заполнение этого массива быть выполнено в «одну строку» (обратите внимание на ;
) как в моем первом примере? У вас есть другие (более умные) идеи, чем мой подход?
Я бы использовал обычный индексированный массив 0, а затем создал бы другое поле в массиве для праздника на время.
$year = 2015;
$holidays = array();
$holidays[] => array(
'holiday' => 'New Year',
'comment' => 'Happy New Year!',
'time' => strtotime($year . '-01-01')
);
$holidays[] => array(
'holiday' => 'Easter',
'comment' => 'Happy Easter!',
'time' => strtotime($year . '-04-05'),
);
...
Затем, если мне нужно отсортировать его, я бы использовал функции сортировки массива php.
Что касается всего этого в одной декларации, вы можете сделать что-то вроде этого:
$holidays = array(
strtotime($year . '-04-05') => array(
array(
'holiday' => 'Easter',
'comment' => 'Happy Easter!',
),
array(
'holiday' => 'Christmas',
'comment' => 'Merry Christmas!'
),
),
);
Просто добавьте больше массивов вниз …
Других решений пока нет …