PHP + MYSQL как группировать месяцы по годам - PullRequest
0 голосов
/ 16 апреля 2020

Мне нужно создать сгруппированный список года / месяца

  • 2020
    • января
    • февраля
  • 2019
    • Май
    • Июнь

Моя таблица (название: отчеты)

введите описание изображения здесь

Запрос

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

Мне нужна помощь со скриптом, отображающим структуру списка

<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>                        

Мой результат. год повторяется дважды

введите описание изображения здесь

1 Ответ

0 голосов
/ 16 апреля 2020

Метод 1:

Если вы хотите агрегацию 2-го уровня в визуале, вам нужно преобразовать ваш массив в другой ассоциативный массив, используя год в качестве ключа

   $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> 

Здесь $count_month_map - это еще один ассоциативный массив, образованный из $count_month

Тогда внутри основного l oop вам нужно иметь второй l oop до l oop, хотя массив массива

Метод 2:

Вы можете сохранить год в вашем l oop в фиктивной переменной, скажем $curr, в конце заключить в скобки другую фиктивную переменную $prev

затем условно вы нажимаете кнопку

    $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> 

Примечание: Метод 2 применим только для отсортированного столбца года, который вы уже делаете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...