Самые внутренние парсеры в вашем примере будут выражением, а в C ++ грамматика определяет expression
как assignment-expression
или другой expression
, за которым следует запятая, а другая assignment-expression
(Приложение A.4 - Грамматика / Выражения).
Грамматика далее определяет assignment-expression
как один из нескольких других типов выражения, ни один из которых не может быть ничем (или только пропуском).
So причина, по которой вы не можете A a(())
, просто потому, что грамматика этого не позволяет. Тем не менее, я не могу ответить, почему люди, которые создали C ++, не позволяли этому конкретному использованию пустых парнеров как своего рода особый случай - я бы предположил, что они предпочли бы не вставлять такой особый случай, если бы разумная альтернатива.
Вы можете создать функцию, рекурсивно использующую strtotime () для подсчета количества дней. Поскольку strtotime ("в следующий понедельник");
отлично работает.
function daycount($day, $startdate, $counter)
{
if($startdate >= time())
{
return $counter;
}
else
{
return daycount($day, strtotime("next ".$day, $startdate), ++$counter);
}
}
echo daycount("monday", strtotime("01.01.2009"), 0);
Надеюсь, это то, что вы ищете :)
без циклов и без рекурсии
<?php
define('ONE_WEEK', 604800); // 7 * 24 * 60 * 60
function number_of_days($days, $start, $end) {
$w = array(date('w', $start), date('w', $end));
$x = floor(($end-$start)/ONE_WEEK);
$sum = 0;
for ($day = 0;$day < 7;++$day) {
if ($days & pow(2, $day)) {
$sum += $x + ($w[0] > $w[1]?$w[0] <= $day || $day <= $w[1] : $w[0] <= $day && $day <= $w[1]);
}
}
return $sum;
}
//$start = $end = time();
// 0x10 == pow(2, 4) == 1 << 4 // THURSDAY
// 0x20 == pow(2, 5) == 1 << 5 // FRIDAY
echo number_of_days(0x01, $start, $end); // SUNDAY
echo number_of_days(pow(2, 0), $start, $end); // SUNDAY
echo number_of_days(0x02, $start, $end); // MONDAY
echo number_of_days(pow(2, 1), $start, $end); // MONDAY
echo number_of_days(0x04, $start, $end); // TUESDAY
echo number_of_days(1 << 2, $start, $end); // TUESDAY
echo number_of_days(0x08, $start, $end); // WEDNESDAY
echo number_of_days(1 << 3, $start, $end); // WEDNESDAY
echo number_of_days(0x10, $start, $end); // THURSDAY
echo number_of_days(0x20, $start, $end); // FRIDAY
echo number_of_days(0x40, $start, $end); // SATURDAY
echo number_of_days(0x01 | 0x40, $start, $end); // WEEKENDS : SUNDAY | SATURDAY
echo number_of_days(0x3E, $start, $end); // WORKDAYS : MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY
?>
Я получил ответ. Он работает только в воскресенье. Но я не знаю, как сделать это в течение следующих дней
<?php
// Define a constant of 1 day in seconds
define(ONE_DAY, 86400);
date_default_timezone_set('America/New_York');
// Accepts two timestamps, start and end
// Returns an array of timestamps that fall on a sunday
function sundays_in_range($start, $end) {
echo date('N', $start);
echo "<br/>";
$days_until_sunday = date('w', $start) > 0 ? 7 - date('w', $start) : 0;
$date = $start + (ONE_DAY * $days_until_sunday);
$sundays = array();
while ($date <= $end) {
array_push($sundays, $date);
$date += (7 * ONE_DAY);
}
return $sundays;
}
// Calculate some example dates. Today, and 30 days from now
$start = time($start);
$end = time($end) + (30 * ONE_DAY);
echo ONE_DAY;
echo "<br/>";
$count=0;
// Loop and output Y-m-d
foreach (sundays_in_range($start, $end) as $sunday)
{
print "<option>".date("Y-m-d", $sunday)."</option><br/>";
$count++;
}
echo $count;
?>