【问题标题】:Keeping a cumulative count of months保持累积的月数
【发布时间】:2016-03-26 21:15:47
【问题描述】:

我想记录日期中出现的月份数,从 CSV 中读取,其中日期以 dd/mm/yyyy 格式输入。 $all 是这些日期的数组。我正在绘制从 9 月开始到 7 月结束的学年中学生的进度。日期代表学生的成绩。我需要累积计数 - 9 月的日期也应计入所有后续月份等。然后我用它来创建一个谷歌图表,如下所示:

我有以下工作代码,感觉很麻烦。我觉得我错过了一些可以用更简洁的方式解决我的问题的东西。

是否有以这种方式处理日期的通用解决方案?你能推荐更广泛的阅读吗?

    foreach ($all as $y) {
    $month = substr($y,3, 2);

    switch ($month) {
        case '09':
            $sep++;$oct++;$nov++;$dec++;$jan++;$feb++;$mar++;$apr++;$may++;$jun++;$jul++;
            break;
        case '10':
            $oct++;$nov++;$dec++;$jan++;$feb++;$mar++;$apr++;$may++;$jun++;$jul++;
            break;
        case '11':
            $nov++;$dec++;$jan++;$feb++;$mar++;$apr++;$may++;$jun++;$jul++;
            break;
        case '12':
            $dec++;$jan++;$feb++;$mar++;$apr++;$may++;$jun++;$jul++;
            break;
        case '01':
            $jan++;$feb++;$mar++;$apr++;$may++;$jun++;$jul++;
            break;
        case '02':
            $feb++;$mar++;$apr++;$may++;$jun++;$jul++;
            break;
        case '03':
            $mar++;$apr++;$may++;$jun++;$jul++;
            break;
        case '04':
            $apr++;$may++;$jun++;$jul++;
            break;
        case '05':
            $may++;$jun++;$jul++;
            break;
        case '06':
            $jun++;$jul++;
            break;
        case '07':
            $jul++;
            break;
        default: 
            $jul++;
    }

}

//All months initially set to 1 to help with scaling issues. 
//Work out percentage of all achievements completed
$NOW  = date("n");
switch($NOW) {
    case '9':
        if ($sep != 1) {
            $sep = round(($sep-1)/$total*100);
        } 
        $oct="null";$nov="null";$dec="null";$jan="null";$feb="null";$mar="null";$apr="null";$may="null";$jun="null";$jul="null";
        break;

    case '10':
        if ($oct != 1) {
            $sep = round(($sep-1)/$total*100);
            $oct = round(($oct-1)/$total*100);
        }
        $nov="null";$dec="null";$jan="null";$feb="null";$mar="null";$apr="null";$may="null";$jun="null";$jul="null";
        break;

    case '11':
        if ($nov != 1) {
            $sep = round(($sep-1)/$total*100);
            $oct = round(($oct-1)/$total*100);
            $nov = round(($nov-1)/$total*100);
        }
        $dec="null";$jan="null";$feb="null";$mar="null";$apr="null";$may="null";$jun="null";$jul="null";
        break;

    case '12':
        if ($dec != 1) {
            $sep = round(($sep-1)/$total*100);
            $oct = round(($oct-1)/$total*100);
            $nov = round(($nov-1)/$total*100);
            $dec = round(($dec-1)/$total*100); 
        }
            $jan="null";$feb="null";$mar="null";$apr="null";$may="null";$jun="null";$jul="null";
        break;

    case '1':
        if ($jan != 1) {
            $sep = round(($sep-1)/$total*100);
            $oct = round(($oct-1)/$total*100);
            $nov = round(($nov-1)/$total*100);
            $dec = round(($dec-1)/$total*100); 
            $jan = round(($jan-1)/$total*100); 
        }
        $feb="null";$mar="null";$apr="null";$may="null";$jun="null";$jul="null";
        break;

    case '2':
        if ($feb != 1) {
            $sep = round(($sep-1)/$total*100);
            $oct = round(($oct-1)/$total*100);
            $nov = round(($nov-1)/$total*100);
            $dec = round(($dec-1)/$total*100); 
            $jan = round(($jan-1)/$total*100);
            $feb = round(($feb-1)/$total*100);
        }
        $mar="null";$apr="null";$may="null";$jun="null";$jul="null";
        break;

    case '3':
        if ($mar != 1) {
            $sep = round(($sep-1)/$total*100);
            $oct = round(($oct-1)/$total*100);
            $nov = round(($nov-1)/$total*100);
            $dec = round(($dec-1)/$total*100); 
            $jan = round(($jan-1)/$total*100);
            $feb = round(($feb-1)/$total*100);
            $mar = round(($mar-1)/$total*100);
        }
        $apr="null";$may="null";$jun="null";$jul="null";
        break;

    case '4':
        if ($apr != 1) {
            $sep = round(($sep-1)/$total*100);
            $oct = round(($oct-1)/$total*100);
            $nov = round(($nov-1)/$total*100);
            $dec = round(($dec-1)/$total*100); 
            $jan = round(($jan-1)/$total*100);
            $feb = round(($feb-1)/$total*100);
            $mar = round(($mar-1)/$total*100);
            $apr = round(($apr-1)/$total*100);
        }
        $may="null";$jun="null";$jul="null";
        break;

    case '5':
        if ($may != 1) {
            $sep = round(($sep-1)/$total*100);
            $oct = round(($oct-1)/$total*100);
            $nov = round(($nov-1)/$total*100);
            $dec = round(($dec-1)/$total*100); 
            $jan = round(($jan-1)/$total*100);
            $feb = round(($feb-1)/$total*100);
            $mar = round(($mar-1)/$total*100);
            $apr = round(($apr-1)/$total*100);
            $may = round(($may-1)/$total*100);
        }
        $jun="null";$jul="null";
        break;

    case '6':
        if ($jun != 1) {
            $sep = round(($sep-1)/$total*100);
            $oct = round(($oct-1)/$total*100);
            $nov = round(($nov-1)/$total*100);
            $dec = round(($dec-1)/$total*100); 
            $jan = round(($jan-1)/$total*100);
            $feb = round(($feb-1)/$total*100);
            $mar = round(($mar-1)/$total*100);
            $apr = round(($apr-1)/$total*100);
            $may = round(($may-1)/$total*100);
            $jun = round(($jun-1)/$total*100);
        }
        $jul="null";
        break;

    case '7':
        if ($jul != 1) {
            $sep = round(($sep-1)/$total*100);
            $oct = round(($oct-1)/$total*100);
            $nov = round(($nov-1)/$total*100);
            $dec = round(($dec-1)/$total*100); 
            $jan = round(($jan-1)/$total*100);
            $feb = round(($feb-1)/$total*100);
            $mar = round(($mar-1)/$total*100);
            $apr = round(($apr-1)/$total*100);
            $may = round(($may-1)/$total*100);
            $jun = round(($jun-1)/$total*100);
            $jul = round(($jul-1)/$total*100);
        }
        break;

    case '8':
        if ($jul != 1) {
            $sep = round(($sep-1)/$total*100);
            $oct = round(($oct-1)/$total*100);
            $nov = round(($nov-1)/$total*100);
            $dec = round(($dec-1)/$total*100); 
            $jan = round(($jan-1)/$total*100);
            $feb = round(($feb-1)/$total*100);
            $mar = round(($mar-1)/$total*100);
            $apr = round(($apr-1)/$total*100);
            $may = round(($may-1)/$total*100);
            $jun = round(($jun-1)/$total*100);
            $jul = round(($jul-1)/$total*100);
        }
        break;

    default:
        echo " ";

}

【问题讨论】:

    标签: php date graph cumulative-line-chart


    【解决方案1】:

    我的建议是不要存储累积数据,更容易存储每月的实际成就数。您可以填写一个array,其键为月份(从 1 到 12):

    $counts = array();
    foreach ($all as $y) {
      $month = (int)substr($y,3,2);
    
      if (isset($counts[$month]))
        $counts[$month] = 0;
    
      $counts[$month]++;
    }
    

    编辑

    现在您可以简单地循环 $counts 来规范每个条目:

    $total = array_sum($counts);
    $sum = 0;
    
    // Avoiding division by zero
    if ($total != 0) {
    
      foreach (array_merge(range(9,12),range(1,7)) as $key) {
    
        $sum += $counts[$key];
        $counts[$key] = round($sum/$total*100);
    
      }
    
    }
    

    【讨论】:

      【解决方案2】:

      这是一个解决方案,应该给出相同的结果:

      // Work with month numbers relative to school year:
      $cur_month  = (3 + date("n")) % 12; // 0 = september, 1 = october, ...
      
      // Collect monthly statistics (August excluded)
      $stats = array_fill(0, 11, 0);
      foreach ($all as $date) {
          // Extract month and transpose to school month: 0 = september, ...
          $month = (3+substr($date,3, 2)) % 12;
          // August is mapped to July
          $month = min(11, $month); 
          // Only data in the past or current month is taken into account:
          if ($month <= $cur_month) $stats[$month]++;
      }
      
      // Cumulate statistics:
      $total = 0;
      foreach ($stats as $month => &$stat) {
          $total += $stat;
          // Avoid zeroes for scaling problems
          $stat = max(1, $total); 
      }
      
      // Don't allow total == 0
      $total = max(1, $total);
      
      // Convert to percentages, and clear future months
      foreach ($stats as $month => &$stat) {
          $stat = $month <= $cur_month
              ? round($stat / $total * 100)
              : 'null';
      }
      
      // Assign to individual variables, if needed
      list($sep, $oct, $nov, $dec, $jan, $feb,
           $mar, $apr, $may, $jun, $jul) = $stats;
      

      【讨论】:

        猜你喜欢
        • 2015-12-08
        • 1970-01-01
        • 1970-01-01
        • 2018-05-13
        • 2021-10-11
        • 1970-01-01
        • 1970-01-01
        • 2020-11-22
        • 2022-01-17
        相关资源
        最近更新 更多