[英]PHP + MYSQL how to group the months by years
I need to create a grouped year / month list我需要创建一个分组的年/月列表
My Table (name: reports)我的表(名称:报告)
enter image description here在此处输入图像描述
Query询问
SELECT YEAR(report_date) as y, MONTH(report_date) as m, report_company_id
FROM reports
WHERE YEAR(report_date) = YEAR(report_date) AND report_company_id="11"
GROUP BY y, m ORDER BY y DESC, m DESC
I need help with a script displaying the structure of the list我需要有关显示列表结构的脚本的帮助
<div class="tab-pane fade show" id="tab-<?php echo $row['company_id']; ?>" role="tabpanel" aria-labelledby="v-pills-home-tab">
<div class="accordion" id="accordionExample">
<div class="card">
<?php
$count_month = $db -> query
(
'SELECT YEAR(report_date) as y, MONTH(report_date) as m, report_company_id
FROM reports
WHERE YEAR(report_date) = YEAR(report_date) AND report_company_id="'.$company_id.'"
GROUP BY y, m
ORDER BY y DESC, m DESC'
);
$last_year = 0;
?>
<div data-role="main" class="ui-content">
<?php
foreach ($count_month as $key) { ?>
<div class="card-header" id="headingOne">
<button class="btn btn-link" type="button" data-toggle="collapse" data-target="#collapseOne-<?php echo $key['y']; ?>" aria-expanded="true" aria-controls="collapseOne"><?php echo $key['y']; ?></button>
</div>
<div id="collapseOne-<?php echo $key['y']; ?>" class="collapse" aria-labelledby="headingOne" data-parent="#accordionExample">
<div class="card-body">
<?php echo $monthName = date('F', mktime(0, 0, 0, $key['m'], 10)); // March ?>
</div>
</div>
<?php } ?>
</div>
</div>
</div>
My result.我的结果。 year is repeated twice
一年重复两次
Method 1:方法一:
If you want 2nd level aggregation in visual then you need to convert your array to another associative array using year as key如果您想要视觉中的第二级聚合,那么您需要使用年份作为键将您的数组转换为另一个关联数组
$count_month_map = Array();
foreach ($count_month as $value) {
if(array_key_exists($value['y'], $count_month_map)) {
array_push($count_month_map[ $value['y'] ], $value);
} else {
$count_month_map[ $value['y'] ] = Array( $value );
}
}
$last_year = 0;
?>
<div data-role="main" class="ui-content">
<?php
foreach ($count_month_map as $key => $value) { ?>
<div class="card-header" id="headingOne">
<button class="btn btn-link" type="button" data-toggle="collapse" data-target="#collapseOne-<?php echo $key; ?>" aria-expanded="true" aria-controls="collapseOne"><?php echo $key; ?></button>
</div>
<?php
foreach ($value as $key1) {
?>
<div id="collapseOne-<?php echo $key1['y']; ?>" class="collapse" aria-labelledby="headingOne" data-parent="#accordionExample">
<div class="card-body">
<?php echo $monthName = date('F', mktime(0, 0, 0, $key1['m'], 10)); // March ?>
</div>
</div>
<?php } ?>
<?php
}
?>
</div>
Here $count_month_map
is another associative array formed from $count_month
这里
$count_month_map
是另一个由$count_month
形成的关联数组
Then inside the main loop you need to have a second loop to loop though the array of array然后在主循环中,您需要有第二个循环来循环数组数组
Method 2:方法二:
You can store the year in your loop in a dummy variable say $curr
, at the end bracket you assign it to another dummy variable $prev
您可以将循环中的年份存储在一个虚拟变量中,比如
$curr
,在最后的括号中将它分配给另一个虚拟变量$prev
then conditionally you suppress the button然后有条件地按下按钮
$curr = '';
$prev = '';
?>
<div data-role="main" class="ui-content">
<?php
foreach ($count_month as $key) {
$curr = $key['y'];
if($prev != $curr) {
?>
<div class="card-header" id="headingOne">
<button class="btn btn-link" type="button" data-toggle="collapse" data-target="#collapseOne-<?php echo $key['y']; ?>" aria-expanded="true" aria-controls="collapseOne"><?php echo $key['y']; ?></button>
</div>
<?php
}
?>
<div id="collapseOne-<?php echo $key['y']; ?>" class="collapse" aria-labelledby="headingOne" data-parent="#accordionExample">
<div class="card-body">
<?php echo $monthName = date('F', mktime(0, 0, 0, $key['m'], 10)); // March ?>
</div>
</div>
<?php
$prev = $curr;
}
?>
</div>
Note: Method 2 only applicable for year column sorted, which you are already doing注意:方法 2 仅适用于已排序的年份列,您已经在做
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.