简体   繁体   English

PHP + MYSQL 如何按年分组月份

[英]PHP + MYSQL how to group the months by years

I need to create a grouped year / month list我需要创建一个分组的年/月列表

  • 2020 2020
    • January一月
    • February二月
  • 2019 2019
    • May可能
    • June六月

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一年重复两次

enter image description here在此处输入图像描述

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM