顶部的数据表日期和从左到右的数据单元格

Posted

技术标签:

【中文标题】顶部的数据表日期和从左到右的数据单元格【英文标题】:datatables dates at the top and data cells going from left to right 【发布时间】:2017-12-29 05:53:32 【问题描述】:

我正在开发一个系统,该系统根据注册成员的位置(小区)为小群注册成员提供服务。我遇到的当前问题是根据特定日期出现的服务数量显示服务列表。 查询是正确的,但我在正确格式化表格时遇到问题

数据应该这样显示

服务 |日期1 |日期2 |等等


健康 | 5 | 3 |等等


牙医 | 10 | 20 |等等

这是我目前所做的:

<div class="col-sm-12">         
                <div class="box-body no-padding">
                        <table class="table cell-border" id="members">
                            <thead>
                                <th>Service</th>
                                    <?php foreach($result as $g)?>
                                            <th><?php echo $g['date'];?></th>
                                    <?php ?>

                            </thead>
                            <tbody> 
                                <tr>
                                    <td><?php echo $g['Service Name'];?></td>
                                    <?php $i=1; foreach($result as $g) ?>
                                    <td> <?php if($g['Attendance'] == 'NULL') echo 0; else  echo $g['Attendance'];?> </td>
                                    <?php ?>
                                </tr>
                            </tbody>
                        </table>
                        </div>

这里是查询:

SELECT record_attendance_cell.id, record_attendance_cell.`company_id`,record_attendance_cell.`cell_id`,record_attendance_cell.`member_id`, COUNT(record_attendance_cell.`present`) as `Attendance`, record_attendance_cell.`service_id`,record_attendance_cell.`date`, setting_company.name `Company Name`, setting_cell_group.`location`, `setting_service`.title as `Service Name`
FROM `record_attendance_cell`
LEFT JOIN setting_company
on setting_company.id = record_attendance_cell.company_id
LEFT JOIN setting_cell_group
on setting_cell_group.id = record_attendance_cell.cell_id
LEFT JOIN setting_service
on setting_service.id = record_attendance_cell.service_id
WHERE record_attendance_cell.`present` = 1 AND record_attendance_cell.`date` BETWEEN '$date_from' AND '$date_to'
group by record_attendance_cell.service_id
order by record_attendance_cell.date asc

【问题讨论】:

“查询是正确的,但我在正确格式化表格时遇到问题”什么是正确的,你现在得到了什么? 这是ibb.co/bTFVvQ查询的结果 【参考方案1】:

根据您的结果和您的描述。我想出了这个:

请试一试(已编辑):

<style>
    table th, table td 
        border: 1px solid #333;
    
</style>
<?php
$result[] = array('Service Name' => 'Health', 'date' => '2017-04-04', 'Attendance' => 5);
$result[] = array('Service Name' => 'Payroll', 'date' => '2017-04-16', 'Attendance' => 5);
$result[] = array('Service Name' => 'Saturday Youth Meeting', 'date' => '2017-04-03', 'Attendance' => 1);
$result[] = array('Service Name' => 'Saturday Youth Meeting', 'date' => '2017-05-03', 'Attendance' => 3);
$result[] = array('Service Name' => 'Payroll', 'date' => '2017-05-03', 'Attendance' => 2);
$result[] = array('Service Name' => 'Payroll', 'date' => '2017-04-11', 'Attendance' => 3);

foreach ($result as $row) 
    $array[$row['Service Name']][$row['date']] = $row;


$start_date = '2017-04-03';
$end_date = '2017-05-03';
echo '<table><thead><tr><th>Service</th>';

$date = $start_date;
WHILE (strtotime($date) <= strtotime($end_date)) 
    echo '<th>' . $date . '</th>';
    $date = date('Y-m-d', strtotime($date . ' +1day'));

echo '</tr></thead>';
echo '<tbody>';

foreach ($array as $key => $value) 
    $date = $start_date;
    echo '<tr><td>'.$key.'</td>';
    WHILE (strtotime($date) <= strtotime($end_date)) 
        if (array_key_exists($date, $array[$key])) 
            echo '<td>' . $array[$key][$date]['Attendance'] . '</td>';
         else 
            echo '<td>0</td>';
        
    $date = date('Y-m-d', strtotime($date . ' +1day'));
    
        echo '</tr>';


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

输出:

http://www.phpwin.org/s/ewbAS6

如果您希望出勤是累积的,只需更改 WHILE 循环(添加)

foreach ($result as $row) 
    $array[$row['Service Name']][$row['date']] = $row;


$start_date = '2017-04-03';
$end_date = '2017-05-03';
echo '<table><thead><tr><th>Service</th>';

$date = $start_date;
WHILE (strtotime($date) <= strtotime($end_date)) 
    echo '<th>' . $date . '</th>';
    $date = date('Y-m-d', strtotime($date . ' +1day'));

echo '</tr></thead>';
echo '<tbody>';

foreach ($array as $key => $value) 
    $date = $start_date;
    echo '<tr><td>'.$key.'</td>';
    $attendance = 0;
    WHILE (strtotime($date) <= strtotime($end_date)) 
        if (array_key_exists($date, $array[$key])) 
            $attendance = $attendance + $array[$key][$date]['Attendance'];
        
        echo '<td>' . $attendance .'</td>';
    $date = date('Y-m-d', strtotime($date . ' +1day'));
    
        echo '</tr>';


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

输出

http://www.phpwin.org/s/5umFBA

【讨论】:

顶部的日期表示搜索之间的日期交互。例如,您在 2017-01-01 和 2017-05-01 之间搜索它应该有每个日期的每个结果。每个日期都将显示在 TH 中,并且每个服务的每个计数值都应在 TD 中正确对齐。 您好 +1 的答案似乎运作良好,只需将时间段从 +1 天调整为 1 周以上。 有一个小问题,表格中显示的数据仅在日期与交互中的日期匹配时显示。例如,如果我在 2017 年 3 月 10 日星期三有 5 人出席,2017 年 4 月 10 日星期四有 12 人出席,并且循环标题是 7/10/2017,则该列将显示 0 ,但它应该至少为 17,因为它应该从前几天汇总。我尝试使用 mysql 并使用 date 函数将数据分组为年、月和周,但仍然存在问题。有什么想法吗? 下次请用您想要的输出准备好您的问题。您的“小问题”与您的原始问题完全不同。请检查我的答案以获取更新的脚本 Michael 您的初始解决方案是正确的,当 DAY 没有值时它应该回显 0,但我需要它为 WEEK 求和。当迭代是每天时,您的新数据只是每个日期的数据聚合,但是当您将其更改为每周时,这些值不会相加。让我给你截图ibb.co/kb3sFQ希望你现在更了解我了?很抱歉造成混乱

以上是关于顶部的数据表日期和从左到右的数据单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何在从左到右和从上到下排序的二维数组中搜索数字?

如何从左到右对齐集合视图单元格?

iOS 用从左到右的动画取消隐藏视图

图像从左到右的淡入淡出效果

从左到右和从右到左移动标签

如何将 viewPager 的方向反转为从左到右的顺序?