2016-12-18 102 views
0

我試圖在一個月內創建考勤表。請檢查使用PHP和MySql創建考勤表

我有這個疑問

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  2016­12­18   H   Nama A  2016­-12-­18 18 
    1111  2016­12­19   I   Nama A  2016­-12-­19 19 
    123456  2016­12­18   H   ADI SURIONO 2016-­12-­18 18 
    123456 2016­12­19   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>  

我得到這個結果我的網站。

enter image description here

我怎樣才能實現?

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來創建它。對不起,我的英語不好。

回答

1

你可以做到這一點,但你需要重構代碼/邏輯的一部分:

你有什麼數據:

<?php 
// Data from DB 
$data[] = ['Nik' => '111', 'tanggal_absensi' => '2016­12­18', 'kodekehadiran' => 'H', 'NamaSiswa' => 'Nama A'] 
$data[] = ['Nik' => '111', 'tanggal_absensi' => '2016­12­19', 'kodekehadiran' => 'I', 'NamaSiswa' => 'Nama A'] 
?> 

你需要什麼 - 一個多層次的數據陣列

<?php 
$dataCalculated[111] = [ 
    '2016­12­18' => ['Nik' => '111', 'tanggal_absensi' => '2016­12­18', 'kodekehadiran' => 'H', 'NamaSiswa' => 'Nama A'], 
    '2016­12­19' => ['Nik' => '111', 'tanggal_absensi' => '2016­12­19', '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視圖代碼:

後,你可以在這個新陣列上的迭代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 - >月&年)

最新變化 - >複製線

當然,有些行會不會有用現在。你只需要一行用戶。

  • 如果用戶已經顯示,您可以跳過該行(需要一個$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

玩得開心!

+0

感謝您的回答。所以我需要先改變我的結果數組? – YVS1102

+0

我會給一個鏡頭 – YVS1102

+0

我不知道在哪裏把它:(。經過一些嘗試數據仍然重複和kodekehadiran沒有顯示出來 – YVS1102