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

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

ขอความช่วยเหลือสร้างตารางกิจกรรมแบบสัปดาห์
ผมเก็บข้อมูลของกิจกรรม 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 การดูว่าเป็นสัปดาห์ที่เท่าไหร่ของปี ใช้คำสั่ง  
 
echo date("W"); // วันนี้เป็นสัปดาห์ที่เท่าไหร่
echo date("W",strtotime("2020-12-31")); // วันสุดท้ายของปีเป็นสัปดาห์ที่เท่าไหร่
 
ส่วนแนวทางการประยุกต์ดูตัวอย่างโค้ดด้านล่างเป็นแนวทางฃ

<!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,582
แนวทางประยุกต์แสดงสรุปรายการแบบตารางรายเดือนจากฐานข้อมูลอ่าน 9,928
การใช้งานรูปแบบข้อความวันที่และเวลา กับฟังก์ชั่น strtotime() ใน phpอ่าน 54,937
ninenik 19-03-2020
 ความคิดเห็นที่ 2
จะลองดูครับ


takabe 23-03-2020 15:17






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