循环一系列整数时,将表示月数的整数转换为年数和月数

问题描述 投票:0回答:5

我正在使用 for 循环来显示数字 1-60:

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

在循环中,我希望能够显示年数和月数。例如:

1 month
2 months
3 month
...
1 year
1 year 1 month
1 year 2 month

等等...

我试过这个:

if (!is_float($i / 12)) {
    $years = $i/12;
} else {
    $years = 'no';
}

这显示了 12 个月的 1,24 个月的 2,但不显示中间的时间。

php time division data-conversion modulo
5个回答
5
投票

您可以使用

%
/
来表示整数部分和除法的其余部分 尝试这个循环来显示结果

 for($i=1; $i<=60; $i++){

        echo 'year = ' . floor($i/12) . ' month = ' .$i%12 . '<br />';

 }

0
投票

我在@scaisEdge的帮助下使用了以下解决方案来完成我的代码

for($i=0; $i<=60; $i++) {
    if(!is_float($i/12)) {
        $years = floor($i / 12).' Year';
        $years = $years.($years > 1 ? 's' : '');
        if($years == 0) {
            $years = '';
        }
    }
    $months = ' '.($i % 12).' Month';
    if($months == 0 or $months > 1) {
        $months = $months.'s';
    }

    $display = $years.''.$months;
    echo '<option value="'.$i.'"';
    if($result["warrenty"] == $i) {
        echo 'selected="selected"';
    }
    echo '>'.$display.'</option>';
}

0
投票
function yearfm($months)
{
  $str = '';

  if(($y = round(bcdiv($months, 12))))
  {
    $str .= "$y Year".($y-1 ? 's' : null);
  }
  if(($m = round($months % 12)))
  {
    $str .= ($y ? ' ' : null)."$m Month".($m-1 ? 's' : null);
  }
  return empty($str) ? false : $str;
}
for($x = 0; $x < 100; $x++)
{
  var_dump(yearfm($x));
}

0
投票

另一种解决方案1:

for ($i=0; $i<=60; $i++) {
    $output = [];
    if ($i >= 12) {
        $years    = ($i - $i % 12) / 12;
        $output[] = $years > 1 ? $years . ' years' : $years . ' year';
    }

    if ($i % 12 > 0) {
        $monthsRest = $i % 12;
        $output[]   = $monthsRest > 1 ? $monthsRest . ' months' : $monthsRest . ' month';
    }
    echo implode(' ', $output);
}

另一个解决方案2:

for ($i=0; $i<=60; $i++) {
    $output    = [];
    $startDate = new DateTime();
    $endDate   = new DateTime('+' . $i . ' months');

    $interval  = $startDate->diff($endDate);
    $years     = $interval->format('%y');
    $months    = $interval->format('%m');

    if ($years > 0) {
        $output[] = $years > 1 ? $years . ' years' : $years . ' year';
    }

    if ($months > 0) {
        $output[] = $months > 1 ? $months . ' months' : $months . ' month';
    }

    echo implode(' ', $output);
}

0
投票

为了干净地编写打印脚本,请将计数器除以 12 的整数值以及同一除法的模数/余数传递给

printf()

代码:(演示

for ($i = 1; $i <= 60; ++$i) {
    printf("Year: %d, Month: %d\n", intdiv($i, 12), $i % 12);
}

输出:

Year: 0, Month: 1
Year: 0, Month: 2
...
Year: 0, Month: 11
Year: 1, Month: 0
Year: 1, Month: 1
Year: 1, Month: 2
...

如果您想处理输出中的复数,则缓存计算值并检查它们是否等于

1
以确定是否包含
s

代码:(演示

for ($i = 1; $i <= 60; ++$i) {
    $years = intdiv($i, 12);
    $months = $i % 12;
    printf(
        "%d year%s, %d month%s\n",
        $years,
        $years !== 1 ? 's' : '',
        $months,
        $months !== 1 ? 's' : ''
    );
}

输出:

0 years, 1 month
0 years, 2 months
...
0 years, 11 months
1 year, 0 months
1 year, 1 month
1 year, 2 months
...

最后,如果您想省略

0
值单位,请有条件地将非零结果累积到临时数组中,并通过使用分隔符进行内爆来呈现。

代码:(演示

for ($i = 1; $i <= 60; ++$i) {
    $result = [];
    $years = intdiv($i, 12);
    if ($years) {
        $result[] = $years . ' year' . ($years !== 1 ? 's' : '');
    }
    $months = $i % 12;
    if ($months) {
        $result[] = $months . ' month' . ($months !== 1 ? 's' : '');
    }
    echo implode(', ', $result) . "\n";
}

输出:

1 month
2 months
...
11 months
1 year
1 year, 1 month
1 year, 2 months
...
© www.soinside.com 2019 - 2024. All rights reserved.