Как бы я соединил функцию PHP5, которая найдет текущую неделю календаря и вернет даты каждого дня недели как массив, начиная с понедельника? Например, если функция была запущена сегодня (Thu Feb 25 2010), функция вернет массив, например:
[0] => Mon Feb 22 2010<br /> [1] => Tue Feb 23 2010<br /> [2] => Wed Feb 24 2010<br /> [3] => Thu Feb 25 2010<br /> [4] => Fri Feb 26 2010<br /> [5] => Sat Feb 27 2010<br /> [6] => Sun Feb 28 2010<br />
Неважно, в каком формате даты хранятся как в массиве, так как я предполагаю, что было бы очень легко изменить. Кроме того, было бы неплохо, если бы у вас была возможность указать дату в качестве параметра и получить календарную неделю этой даты вместо текущей.
Благодаря!
Я предполагаю, что решение должно состоять в том, чтобы получить strtotime
метку, соответствующую последнему понедельнику, используя strtotime
:
$timestampFirstDay = strtotime('last monday');
Но если вы попробуете сегодня (в четверг) , что-то вроде этого:
$timestampFirstDay = strtotime('last thursday'); var_dump(date('Ym-d', $timestampFirstDay));
ты получишь :
string '2010-02-18' (length=10)
т.е. на прошлой неделе … Для strtotime «последний» означает «тот, который был до сегодняшнего дня» .
Это означает, что вам нужно будет проверить, является ли сегодня «последним понедельником», возвращенное strtotime
плюс одна неделя – и, если да, добавьте одну неделю …
Вот возможное решение (возможно, более умное) :
$timestampFirstDay = strtotime('last monday'); if (date('Ym-d', $timestampFirstDay) == date('Ym-d', time() - 7*24*3600)) { // we are that day... => add one week $timestampFirstDay += 7 * 24 * 3600; }
И теперь, когда у нас есть отметка времени «последний понедельник» , мы можем написать простую петлю for
циклов, которая циклически 7 раз, добавив 1 день каждый раз, например:
$currentDay = $timestampFirstDay; for ($i = 0 ; $i < 7 ; $i++) { echo date('Ym-d', $currentDay) . '<br />'; $currentDay += 24 * 3600; }
Что даст нам такой выход:
2010-02-22 2010-02-23 2010-02-24 2010-02-25 2010-02-26 2010-02-27 2010-02-28
Теперь, до вас:
for
цикла, чтобы он сохранял даты в массиве date
Повеселись 😉
Лизингополучатель. , Во-первых, чтобы избежать каких-либо проблем с часовым поясом, я бы привязал к полудню в тот день, когда вы хотите сравнить, так что час в любом случае не вызовет никаких проблем.
$dateCompare = time(); // replace with a parameter $dateCompare = mktime(12, 0, 0, date('n', $dateCompare), date('j', $dateCompare), date('Y', $dateCompare));
Затем найдите день недели вашей даты.
$dow = date('N', $dateCompare);
1 – понедельник, так что выясните, сколько дней с понедельника мы.
$days = $dow - 1;
Теперь вычитайте количество дней в секундах, пока вы не вернетесь в понедельник.
$dateCompare -= (3600 * 24 * $days);
Теперь соберите свой массив дней.
$output = array(); for ($x = 0; $x < 7; $x++) { $output[$x] = $dateCompare + ($x * 24 * 3600); }
Это массив временных меток, но вы можете сохранить даты как строки, если хотите.