2013-07-29 2 views
1

Я работаю с php-кодом, для начала я использую for stat.Найти високосные годы

for($i=0; $i<4; $i++) 

Теперь я понимаю, что $ я = 0 отсчеты от 0 до $ я < $ 4 средства отсчитываются от 0 до ниже 4.

То, что я пытаюсь достичь добавить несколько для операторов, а не использовать мультипликатор php-коды.

for($i=0; $i<4; $i++) 
for($i=4; $i<8; $i++) 
for($i=8; $i<12; $i++) 
for($i=12; $i<16; $i++) 

....... и так, что он перечисляет все результаты.

<?php 
$day = ""; 
for($i=0; $i<4; $i++) 
{ 
    $day = date("d", mktime(0, 0, 0, 2, 29, date("Y")+$i)); 
    if($day == 29) 
    { 
     $year = date("Y")+$i; 
     break; 
    } 
} 
echo "<p>The next leap year is 29th February $year</p>";  
?> 

переспросил результат будет:

Следующий високосный год 29 февраля 2016

Следующий високосный год 29 февраля 2020

+0

В чем проблема? – dreamweiver

+0

_Что я пытаюсь достичь, это добавить несколько для операторов, а не использовать несколько php-кодов. Не могли бы вы рассказать об этом? – Phas1c

+0

@ Phas1c Используйте синтаксический оператор для 'for ($ i = 0; $ i <16; $ i ++)' –

ответ

3

Почему не нравится?

<?php 
    for($i=0; $i<16; $i++) 
    { 
     $day = date("d", mktime(0, 0, 0, 2, 29, date("Y")+$i)); 
     if($day == 29) 
     { 
      $year = date("Y")+$i; 
      echo "<p>The next leap year is 29th February $year</p><br>"; 
     } 
    } 
?> 
5

Используйте conditions for a leap year и просто проверяйте годы. Используйте для этого один оператор!

function is_leap_year($year) 
{ 
    return ((($year % 4) == 0) && ((($year % 100) != 0) || (($year % 400) == 0))); 
} 
+0

Хотя это хороший ответ, слишком много ненужных брекетов. Вот улучшенная версия (без этих дополнительных фигурных скобок): 'return $ year% 4 == 0 && ($ year% 100! = 0 || $ year% 400 == 0);' – evilReiko

7

Вы можете проверить високосный год с date("L")

$yearsToCheck = range(2013, 2020); 

foreach ($yearsToCheck as $year) { 
    $isLeapYear = (bool) date('L', strtotime("$year-01-01")); 
    printf(
     '%d %s a leap year%s', 
     $year, 
     $isLeapYear ? 'is' : 'is not', 
     PHP_EOL 
    ); 
} 

Выход

2013 is not a leap year 
2014 is not a leap year 
2015 is not a leap year 
2016 is a leap year 
2017 is not a leap year 
2018 is not a leap year 
2019 is not a leap year 
2020 is a leap year 
2

Используйте DateTime классы, чтобы сделать этот вид вещи быстро и просто: -

$datetime = new \DateTime("2013/01/01"); 
$interval = new \DateInterval('P1Y'); 
$period = new \DatePeriod($datetime, $interval, 20); 
foreach($period as $date){ 
    if((bool)$date->format('L')){ 
     echo $date->format('Y') . " is a Leap Year</br>\n"; 
    } 
} 

Выход: -

2016 is a Leap Year 
2020 is a Leap Year 
2024 is a Leap Year 
2028 is a Leap Year 
2032 is a Leap Year 

Вы могли бы сделать функцию этого для облегчения повторного использования: -

/** 
* @param int $numberOfYears 
* @return array 
*/ 
function getLeapYears($numberOfYears = 10){ 
    $result = array(); 
    $datetime = new \DateTime(); 
    $interval = new \DateInterval("P1Y"); 
    $period = new \DatePeriod($datetime, $interval, $numberOfYears); 
    foreach($period as $date){ 
     if((bool)$date->format('L')){ 
      $result[] = $date->format('Y'); 
     } 
    } 
    return $result; 
} 

Или тест, если данный год является високосным: -

function isLeapYear($year) 
{ 
    return (bool)\DateTime::createFromFormat('Y', $year)->format('L'); 
}