ขอความช่วยเหลือสร้างตารางกิจกรรมแบบสัปดาห์

ถาม-ตอบ แนะนำไอเดียว โค้ดตัวอย่าง แนวทาง วิธีแก้ปัญหา ขอความช่วยเหลือสร้างตารางกิจกรรมแบบสัปดาห์

ขอความช่วยเหลือสร้างตารางกิจกรรมแบบสัปดาห์
ผมเก็บข้อมูลของกิจกรรม DB แบบนี้
id activity startDate endDate
1 AAAA 2020-01-03 2020-01-10
2 BBBB 2020-03-10 2020-03-24
3 CCCC 2020-03-25 2020-04-06
4 DDDD 2020-04-06 2020-04-10
5 EEEE 2020-04-10 2020-07-07
6 FFFF 2020-07-08 2020-07-31

อยากทำเป็นตารางในลักษณะดังรูปครับ code php ครับ
ทำได้แล้ว
1. สร้างตารางกิจกรรม
2. แสดงรายการกิจกรรม
3. สร้างหัวตารางรายเดือน (วนลูปเดือน ม.ค. - ธ.ค.)

ปัญหาคือ
1. จะเขียนโค๊ดยังไงว่าในปีแต่ละปี มีกี่สัปดาห์
2. แต่ละเดือนมีกีสัปดาห์ (ช่องของ week รายเดือน)
3. จะเอาวันเริ่มต้นและวันสุดท้ายของแต่ละกิจกรรมมาใส่ให้ ตรงสัปดาห๋ของแต่ละเดือนได้อย่างไร (ไอไลน์ในช่องตารางสัปดาห์)

*** ขอตัวอย่างหน่อยครับ ศึกษาจากตารางสอน ไม่รู้จะไปต่ออย่างไร ***


Takabe 19-03-2020 11:41:28

คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )

 ความคิดเห็นที่ 1
การที่จะบอกว่าเดือนไหน มีกี่สัปดาห์ หรือ เดือนไหน มีสัปดาห์ที่เท่าไหร่บ้าง 
ไม่น่าจะทำได้โดยสมบูรณ์ อาจจะได้ค่าโดยประมาณ สมมติ เช่น 
วันที่ 1 เดือน 4 อยู่ในสัปดาห์เดียวกับวันที่ 31 เดือน 3 ดังนั้น ลำดับสำหรับสัปดาห์หนึ่ง
อาจจะอยู่ได้ทั้ง เดือน 3 และ 4 
     ใน php การดูว่าเป็นสัปดาห์ที่เท่าไหร่ของปี ใช้คำสั่ง  
 
1
2
echo date("W"); // วันนี้เป็นสัปดาห์ที่เท่าไหร่
echo date("W",strtotime("2020-12-31")); // วันสุดท้ายของปีเป็นสัปดาห์ที่เท่าไหร่
 
ส่วนแนวทางการประยุกต์ดูตัวอย่างโค้ดด้านล่างเป็นแนวทางฃ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>Document</title>
    <link rel="stylesheet" href="https://unpkg.com/bootstrap@4.3.1/dist/css/bootstrap.min.css" >
</head>
<body>
<style type="text/css">
.myevent-class{
    background-color:yellow;   
}
.wrap_event{
    width:800px;
    margin:auto;
    overflow:hidden;
    overflow-x:auto;   
}
.block-event {
    width:50px;
}
</style>
 <?php
date_default_timezone_set('Asia/Bangkok');
$dayTH = array('อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์');
$monthTH = array(null,'มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน','กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม');
$monthTH_brev = array(null,'ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.','ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.');
 
$_startDate = "2020-01-01";
$_endDate = date("Y-m-d",strtotime($_startDate."+1 year -1 day")); // วันสุดท้ายของปี คิดจาก จากวันเริ่มต้นปี
$_totalWeek = (int)date("W",strtotime($_endDate)); // สัปดาห์สุดท้ายของปี
$arr_w = array(); // อาเรย์เก็บสัปดาห์ที่ของวันสุดท้าย แต่ละเดือน
$arr_w_num = array(); // อาเรย์เก็บจำนวนสัปดาห์ของแต่ละเดือนโดยประมาณ
for($i = 0; $i <= 12; $i++){ // วนลูปให้ครบ 12 เดืนอ
    $arr_w[$i] = (int)date("W",strtotime($_startDate." + $i month -1 day")); // วันสุดท้ายของเดือน ตรงกับสัปดาห์ที่?
    if($i > 0){ // เริ่มคำนวณหา จำนวนสัปดาห์ของแต่ละเดือนโดยประมาร
        $arr_w_num[$i] = $arr_w[$i] - $arr_w[$i-1];  // ลบสัปดาห์ของเดือน กับเดือนก่อนหน้า หาจำนวนสัปดาห์แต่ละเดือน
        if($i == 12 && $arr_w_num[12] < array_sum($arr_w_num)){ // กรณีเดือนสุดท้าย หากจำนวนสัปดาห์ไม่ครบ ให้เพิ่มจนครบ
            $arr_w_num[12]++;
        }
    }else{ // ไมใช้ค่าจาก $i = 0
        $arr_w_num[$i] = 0;
    }
}
?>
<?php
// อาเรย์ข้อมูลจำลอง database
$simpleData = array(
    array("1","AAAA","2020-01-03","2020-03-10"),
    array("2","BBBB","2020-03-10","2020-03-24"),
    array("3","CCCC","2020-03-25","2020-04-06"),
    array("4","DDDD","2020-04-06"," 2020-04-10"),
    array("5","EEEE","2020-04-10","2020-07-07"),
    array("6","FFFF","  2020-07-08","2020-07-31")
);
//$simpleData[0][0] จะเท่ากับ 1;
//$simpleData[1][1]  จะเท่ากับ BBBB;
// หาใช้จาก database ก็จะมีค่าเท่ากับ
// $simpleData = $result->fetch_assoc(); // หรือ $result->fetch_array()
?>
<div class="wrap_event">
<table width="100%" border="1" cellspacing="0" cellpadding="0">
  <tr>
    <td width="50" rowspan="2">A</td>
    <td width="50" rowspan="2">B</td>
    <!--วนลูปจำนวนเดือน-->
    <?php for($c = 1; $c <= 12; $c++){?>
    <td colspan="<?=$arr_w_num[$c]?>" width="50"><?=$monthTH_brev[$c]?></td>
    <?php } ?>
  </tr>
  <tr>
  <!--วนลูปจำนวนสัปดาห์ทั้งหมด-->
  <?php for($c = 1; $c <= $_totalWeek; $c++){?>
    <td width="50">
        <!--เพิ่ม div คลุม สำหรับกำหนดความกว้างให้แต่ละ week-->
        <div class="block-event">F <?=$c?></div>
    </td>
    <?php } ?>
  </tr>
<!--  วนลูปแสดงข้อมูลแต่ละแถว-->
  <?php foreach($simpleData as $key => $value){ ?>
  <?php
  $bgEvent = ""; // ตัวแปรสำหรับกำหนด css class ประยุกต์กำหนดสีพื้นหลัง
  ?>
  <tr>
    <td width="50"><?=$value[0]?> </td>
    <td width="50"><?=$value[1]?> </td>
   <!-- วนลูปสัปดาห์ทั้งหมด ในส่วนของข้อมูล-->
    <?php for($c = 1; $c <= $_totalWeek; $c++){?>
    <?php
    if($c >= (int)date("W",strtotime($value[2]))){ // เริ่มต้นสัปดาห์กิจกกรม  สำหรับกำหนด css class
        $bgEvent = "myevent-class"; // กำหนด css class ที่จะใช้งาน
        if($c > (int)date("W",strtotime($value[3]))){ // สิ้นสุดสัปดาห์กิจกรรม ยกเลือก css class
            $bgEvent = "";
        }
    }else{
        $bgEvent = "";
    }
    ?>
    <td class="<?=$bgEvent?>" width="50">G  <?=$c?></td>
     <?php } ?>
  </tr>
  <?php } ?>
  <?php // } ?>
</table>
</div>
</body>
</html>

ตัวอย่าง DEMO

บทความแนะนำที่เกี่ยวข้อง
การสร้างวันเวลาปัจจุบัน ด้วยฟังก์ชัน date()อ่าน 37,933
แนวทางประยุกต์แสดงสรุปรายการแบบตารางรายเดือนจากฐานข้อมูลอ่าน 10,237
การใช้งานรูปแบบข้อความวันที่และเวลา กับฟังก์ชั่น strtotime() ใน phpอ่าน 56,363
ninenik 19-03-2020
 ความคิดเห็นที่ 2
จะลองดูครับ


takabe 23-03-2020 15:17






เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ