PHP цикл месячной строки с еженедельными столбцами

#php #mysql

#php #mysql

Вопрос:

Я настраиваю отчет со следующими столбцами: месяц, Касса, Неделя 1, неделя 2, неделя 3, неделя 4 и неделя 5 и общая коллекция за месяц.

У меня возникают трудности с суммированием суммы из базы данных за каждую неделю строки.

Может быть, если кто-нибудь может мне помочь, как отобразить список дат в пределах каждой недели месяца, это было бы полезно!

Это покажет ежемесячную коллекцию кассиров.

Я не хочу еженедельно суммировать коллекцию из базы данных с каждого месяца. кассиры.

Ежемесячная таблица еженедельного сбора

Таблица базы данных

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

Мой код.

 if($teller_cnt > 0) {
$new_start_week = 0;
$weeks_num = 5;

for($m = 1; $m<=12; $m  ) {

    $weeks_num = weeks_num($m, $year);
    $num_of_weeks = $weeks_num;
    $monthname = date_formating($m, '!m', 'F');

    $total_per_month = 0;

    $min_1 = 0;
    if($m > 1) {
        if($num_of_weeks == 4) {
            $new_start_week = ($new_start_week   $weeks_num)   1;
            $weeks_num = ($weeks_num   $new_start_week);
            $msg = '<span class="label label-danger">4 Months</span>';

        }else{
            $new_start_week = ($new_start_week   $weeks_num);
            $weeks_num = ($weeks_num   $new_start_week);
            $msg = '<span class="label label-info">5 Montsh</span>';
            $min_1 = -1;
        }
    }else{

        if($num_of_weeks == 4) {
            $msg = '<span class="label label-danger">4 Months</span>';
        }else{
            $msg = '<span class="label label-info">5 Montsh</span>';
        }
    }

    if(weeks_num(($m-1), $year)==4) {
        $weeks_num = $weeks_num - 1;
        $new_start_week = $new_start_week - 1;
    }

    echo '<tr>';
    echo '<td rowspan="'.($teller_cnt 1).'">';
    echo $monthname.' <br>';
    //echo 'Num of Weeks per month: '.$num_of_weeks. ' <br> ';
    //echo 'Start Of Week Num: ' . $new_start_week;
    //echo $msg . '<br>';
    echo '</td>';
    echo '</tr>';


    foreach ($qry_pay_tellers->result() as $row) {

        $qry_total_payapplied = $this->db->query("SELECT SUM(amt)   SUM(intrst) AS amt FROM payapplied WHERE teller = {$row->teller} AND YEAR(tdate) = $year AND MONTH(tdate) = $m")->row();

        $total_teller_amt = ($qry_total_payapplied) ? $qry_total_payapplied->amt : 0;

        echo '<tr>';
        echo '<td>' . $row->teller . '</td>';

        /*
        $firstDayOfMonth = new DateTime("1st $monthname");
        $lastDayOfMonth = new DateTime($firstDayOfMonth->format('t M Y'));
        $oneDay = new DateInterval('P1D');
        $period = new DatePeriod($firstDayOfMonth, $oneDay, $lastDayOfMonth->add($oneDay));
        */

        $days_arr = array();

        $begin = new DateTime('2019-01-01');
        $end = new DateTime('2019-12-31');
        $interval = DateInterval::createFromDateString('1 day');
        $period = new DatePeriod($begin, $interval, $end);

        foreach($period as $date)
        {
            $dates = $date->format('Y-m-d');
            $week_num = $this->db->query("SELECT WEEK('$dates', 'Monday') AS weeknum;")->row();
            $days_arr[$week_num->weeknum][] = array('dayname' => $date->format('D'), 'date' =>  $dates);
            // echo $dates . ' - ' . $week_num->weeknum . '<br>';
        }

        for($w = $new_start_week; $w < $weeks_num; $w  ) {
            echo '<td>';
            /*
            echo $w . '<br>';

            foreach($days_arr[$w] as $wrow) {
                echo $wrow['date'] . '<br>';
            }
            */
            echo '</td>';
        }
        //echo '<td class="number">'.number_format($total_teller_amt, 2).'</td>';

        if($num_of_weeks > 4) {
            echo '<td class="number">'.number_format($total_teller_amt, 2).'</td>';
        }else{
            echo '<td colspan="2" class="number">'.number_format($total_teller_amt, 2).'</td>';
        }


        echo '</tr>';

        $total_per_month  = $total_teller_amt;

    }



    echo '<tr>';
    echo '<td class="number" colspan="8">'.number_format($total_per_month, 2).'</td>';
    echo '</tr>';
}
}
  

Комментарии:

1. Вы не сказали нам, что в данный момент делает ваш код или что происходит не так. Дайте нам подсказку, с чего начать. Спасибо.

2. Я сказал, что у меня возникают трудности с суммированием данных из базы данных в течение недели. Возможно, может помочь отображение всех дат каждую неделю. чтобы я мог подвести итог всем транзакциям в течение этих дат.

3. Да, вы это сказали … но «трудности» — это не постановка проблемы или описание поведения вашего кода. Если бы вы сказали врачу, что у вас возникли «трудности», как вы думаете, он смог бы поставить вам диагноз?

4. Я это исправил и добавил решение, спасибо за совет: D

Ответ №1:

Мое решение.

В любом случае спасибо.

Таблица за неделю

Создал массив дней с января по декабрь и определил номера его недель.

 $begin = new DateTime( '2019-01-01' );
$end = new DateTime( '2019-12-31' );
$end = $end->modify( ' 1 day' );

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);

$dates_arr = array();
foreach($daterange as $date){

  $dates = $date->format('Y-m-d');
  $week_num = $this->db->query("SELECT WEEK('$dates', 'Monday') AS weeknum;")->row();

  $month_n = (int)$date->format('m');
  $dates_arr[$month_n][] = array(
      'week' => $week_num->weeknum,
      'dayname' => $date->format('D'),
      'dates' => $date->format('Y-m-d')
  );
}
  

Затем создайте таблицу для индексации месяца и недели и запросите счетчики циклов

 echo '<div class="row">';
echo '<div class="col-md-12">';
echo '<table class="table table-hover table-condensed table-bordered table-striped table-small">';
echo '<thead>';
echo '<th>Month</th>';
echo '<th>Teller</th>';
echo '<th>Week 1</th>';
echo '<th>Week 2</th>';
echo '<th>Week 3</th>';
echo '<th>Week 4</th>';
echo '<th>Week 5</th>';
echo '<th></th>';
echo '<th>Total</th>';
echo '</thead>';
echo '<tbody>';

for($month = 1; $month<=12; $month  ) {
$total_per_month = 0;
$weeks_r = array();
foreach ($dates_arr[$month] as $rw) {
    $weeks_r[] = $rw['week'];
}
$u_week_r = array_unique($weeks_r);

$monthname = date_formating($month, '!m', 'F');

echo '<tr>';
echo '<td rowspan="' . ($teller_cnt   1) . '">';
echo $monthname . ' <br>';
echo '</td>';
echo '</tr>';
$total_teller_amt = 0;
foreach ($qry_pay_tellers->result() as $row) {
    echo '<tr>';
    echo '<td>' . $row->teller . '</td>';
    foreach ($u_week_r as $wrow) {
        echo '<td class="number" style="font-size: 8px;">';
        $dates_arr_s = array();

        foreach ($dates_arr[$month] as $drow) {
            if ($drow['week'] == $wrow) {
                if(isWeekend($drow['dates']) == false) {
                    $dates_arr_s[] = $drow['dates'];
                    $qry_pay_applied_wamt = $this->db->query("
                        SELECT SUM(amt)   SUM(intrst) AS amt FROM payapplied WHERE teller = {$row->teller} AND CAST(tdate AS DATE) = '{$drow['dates']}'
                        ")
                        ->row();

                    $amt_per_week = ($qry_pay_applied_wamt) ? $qry_pay_applied_wamt->amt : 0;
                    $total_teller_amt  = $amt_per_week;
                    echo '<span style="float: left !important;">'.$drow['dates'] . ' - ' . $drow['dayname'] . '</span><span class="pull-right">'.number_format($amt_per_week, 2).'</span><br>';
                }
            }
        }



        echo '</td>';
    }

    if(count($u_week_r) > 4) {
        if(count($u_week_r) > 5) {
            echo '<td class="number">' . number_format($total_teller_amt, 2) . '</td>';
        }else{
            echo '<td colspan="2" class="number">' . number_format($total_teller_amt, 2) . '</td>';
        }
    } else {
        echo '<td colspan="3" class="number">' . number_format($total_teller_amt, 2) . '</td>';
    }
    echo '</tr>';
    $total_per_month  = $total_teller_amt;
}
echo '<tr>';
echo '<td class="number" colspan="9">'.number_format($total_per_month, 2).'</td>';
echo '</tr>';
}

echo '</tbody>';
echo '</table>';
echo '</div>';
echo '</div>';