我正在尝试在一个月内创建一个考勤表。请检查
我有这个查询
select d.Nik,d.tanggal_absensi,d.kodekehadiran,c.NamaSiswa,d.tanggal_absensi,day(d.tanggal_absensi) tanggal from absensi d left join mastersiswa c on d.NIK = c.NIK left join siswa_kelas z on d.Nik = z.NIK left join kelas a on a.ID = z.Kelas where a.ID = '1' and month(d.tanggal_absensi) = '12' GROUP BY d.Nik,d.tanggal_absensi,d.kodekehadiran,c.NamaSiswa,a.Kelas,d.tanggal_absensi,day(d.tanggal_absensi)
我的查询得到了这个结果
Nik tanggal_absensi kodekehadiran NamaSiswa tanggal_absensi tanggal
1111 20161218 H Nama A 2016-12-18 18
1111 20161219 I Nama A 2016-12-19 19
123456 20161218 H ADI SURIONO 2016-12-18 18
123456 20161219 H ADI SURIONO 2016-12-19 19
这是我的HTML& PHP
<table width="100%" class="table table-bordered table-striped">
<thead>
<tr align="center">
<th width="6%">No</th>
<th width="19%">Nama</th>
<?php for($x=1;$x<=31;$x++){ ?><th><?php echo $x;?></th> <? } ?>
</tr>
</thead>
<tbody>
<?
$no = 0;
foreach($absensi as $tampil){
$no++;
?>
<tr>
<td><?=$no?></td>
<td><?=$tampil->NamaSiswa;?></td>
<?php for($x=1;$x<=31;$x++){ ?>
<td>
<?php if($tampil->tanggal == $x){echo $tampil->kodekehadiran;} ?>
</td>
<?php } ?>
</tr>
<?php } ?>
</tbody>
</table>
我在我的网站上得到了这个结果。
我如何实现?
No Nama 1 - 2 - 3 - 4 - 5 - 18 19 - 20 - 21 - 22
1 NAMA A - - - - - H I - - -
2 Nama B - - - - - I H - - -
所以,我不知道如何list all day in a month
所以,我使用for
与php创建它。对不起,我的英语不好。
答案 0 :(得分:1)
你可以做到,但你需要重构一部分代码/逻辑:
<?php
// Data from DB
$data[] = ['Nik' => '111', 'tanggal_absensi' => '20161218', 'kodekehadiran' => 'H', 'NamaSiswa' => 'Nama A']
$data[] = ['Nik' => '111', 'tanggal_absensi' => '20161219', 'kodekehadiran' => 'I', 'NamaSiswa' => 'Nama A']
?>
<?php
$dataCalculated[111] = [
'20161218' => ['Nik' => '111', 'tanggal_absensi' => '20161218', 'kodekehadiran' => 'H', 'NamaSiswa' => 'Nama A'],
'20161219' => ['Nik' => '111', 'tanggal_absensi' => '20161219', 'kodekehadiran' => 'I', 'NamaSiswa' => 'Nama A']
];
?>
怎么做?循环每个$数据并创建另一个$ dataCalculated 这将包括您的代码的逻辑。这里:按用户排序(Nik), 并在日期之后。正如您所看到的,这是第一列和 表格的标题:)
<?php
$dataCalculated = [];
foreach( $data as $row ) {
// We create the first array level, if this is the first time
if( !isset($dataCalculated[ $row['Nik'] ]) ) {
$dataCalculated[ $row['Nik'] ] = [];
}
// We fill the row data
$dataCalculated[ $row['Nik'] ][ $row['tanggal_absensi'] ] = $row;
}
?>
之后,您可以在HTML文件上迭代这个新数组。
<?php for($x=1 ; $x<=31 ; $x++): ?>
<td>
<?php if( isset($dataCalculated[ $tampil->Nik ][ date('Y-m-d', mktime(0, 0, 0, '12', $x, '2016')) ]) ): ?>
<?php echo $dataCalculated[ $tampil->Nik ][ date('Y-m-d', mktime(0, 0, 0, '12', $x, '2016')) ]['kodekehadiran']; ?>
<?php endif; ?>
</td>
<?php endfor; ?>
小心,我手动输入了一些数据(
mktime
- &gt;月和年)
当然,有些线路现在没用。你只需要用户一行。
$previousNik
变量和支票),您可以跳过该行。例如:
<?php
$dataCalculated = [];
$dataUsers = [];
foreach( $data as $row ) {
// We create the first array level, if this is the first time
if( !isset($dataCalculated[ $row['Nik'] ]) ) {
$dataCalculated[ $row['Nik'] ] = [];
}
// We fill the row data
$dataCalculated[ $row['Nik'] ][ $row['tanggal_absensi'] ] = $row;
$dataUsers[ $row['Nik'] ] = ['Nik' => $row['Nik'], 'NamaSiswa' => $row['NamaSiswa']];
}
?>
并在代码中使用它:)(变量$dataUsers
)
玩得开心!