我想保留日期中的月数,从CSV中读取日期以dd / mm / yyyy格式输入。 $all
是这些日期的数组。我正在绘制学生在9月开始并在7月结束的学年的进展情况。日期代表学生的成就。我需要计算累积数量 - 9月份的日期也应计入所有后续月份等。然后我使用它来创建Google图表,如下所示:
我有以下工作代码,感觉非常麻烦。我觉得我错过了一些可以更简洁的方法来解决我的问题。
是否有以这种方式处理日期的常见解决方案?你能建议更广泛的阅读吗?
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 " ";
}
答案 0 :(得分:0)
我的建议不是存储累积数据,而是每月存储实际成就数量更容易。您可以填写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);
}
}
答案 1 :(得分:0)
这是一个解决方案,应该给出相同的结果:
// 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;