ประกาศค่าตัวแปรวันที่
$results = array();
$all_date = array(
'2017-10-31',
'2017-12-29','2017-12-30','2017-12-31','2018-01-01','2018-01-02',
'2018-03-12', '2018-03-13', '2018-03-14', '2018-03-15',
'2018-02-28', '2018-03-01', '2018-03-02', '2018-03-07', '2018-03-09',
'2019-03-20', '2019-03-21'
);
ผลลัพธ์ที่ต้องการ
สร้างตัวแปรเดือนแบบย่อ
$short_month = array('01' => 'ม.ค.', '02' => 'ก.พ.', '03' => 'มี.ค.', '04' => 'เม.ย.', '10' => 'ต.ค.', '12' => 'ธ.ค.');
1. เรียงวันที่จากน้อยไปมากเพื่อวนลูป
sort($all_date);
2. นับจำนวนวัน เพื่อใช้ตรวจสอบกรณีต่อเนื่องกันทั้งหมด
$num_date = count($all_date);
3. ตรวจสอบว่า วันแรก และวันสุดท้าย ห่างกันเท่ากันหรือไม่
ถ้าเท่ากัน แสดงว่าต่อเนื่องทั้งหมด นำวันที่แรก กับวันที่สุดท้ายมาต่อกันได้เลย
$date1 = $all_date[0];
$date2 = end($all_date);
$diff_mydate = my_diff_date($date1, $date2);
if($diff_mydate == $num_date){//ถ้าเท่ากัน นำวันที่แรก กับวันที่สุดท้ายมาต่อกันได้เลย
$arr_date1 = explode('-', $date1);
$arr_date2 = explode('-', $date2);
$results[] = $arr_date1[2] . ' ' . $short_month[$arr_date1[1]] . ' - ' . $arr_date2[2] . ' ' . $short_month[$arr_date2[1]] . ' ' . ($arr_date2[0]+543);
}else{
//แทรกโค้ดข้อ 4.
}
4. วนลูปจากวันที่เริ่มต้น ไปจนถึงวันสุดท้าย เพื่อบวกค่าที่ละ 1 วัน แล้วเช็คว่าต่อเนื่องกันหรือไม่
$data = array();
$check_date = '';//วันที่ถัดไป สำหรับตรวจสอบ
$prev_date = '';
$prev_year = 0;
$start_year = 0;
$no = 0;
foreach($all_date as $date){
$arr = explode('-', $date);
$new = $arr[2] . ' ' . $short_month[$arr[1]];
if($date != $check_date){//ถ้าวันที่ถัดไป ไม่ตรงกันแสดงว่าไม่ต่อเนื่อง
$results[$no] = $new;// ให้เซ็ตวันที่ใหม่เข้าไปใน Array
$current_year = ($arr[0]+543);
$year = '';
if($start_year != $prev_year){// ตรวจสอบปี ว่ามีการข้ามปีหรือไม่
$year = ' ' . $start_year;//ถ้าข้ามปี ให้เอาปีเก่า ต่อไปในวันที่แรก ก่อนจะเพิ่มวันทีสุดท้ายเข้าไป
}
// Set Last of prev array
if($no > 0){
if($prev_date != ''){//มีการกำหนดค่าวันที่ตรวจสอบก่อนหน้านี้ เมื่อไม่ต่อเนื่องกัน ให้แทรกไปยัง Array ตัวก่อนหน้า
$results[$no-1] .= $year . ' - ' . $prev_date;
$prev_date = '';//Reset
}else{//แต่ถ้าก่อนหน้านั้น ไม่ใช่วันที่ต่อเนื่องจะไม่มีการเก็บวันที่ ให้แทรก ปีต่อท้าย Array ก่อนหน้าไปเลย
$results[$no-1] .= ' ' . $prev_year;
}
}
//echo '<br>year : ', $start_year , ', ' , $current_year;
$start_year = $current_year;
$no++;
}else{ //ถ้าวันที่ยังต่อเนื่องกันอยู่ เก็บวันปัจจุบันเอาไว้ ต่อท้ายกรณีเปลี่ยนค่าไม่ต่อเนื่อง
$prev_date = $new . ' ' . ($arr[0]+543);
$new = '';
}
//echo '<br/>Current '. $date , ' != '. ($date != $check_date) .' : ' , $check_date.', ' , $new;
//สร้างวันที่ถัดไป เพื่อใช้ตรวจสอบความต่อเนื่อง
$prev_year = ($arr[0]+543);
$dateAdd = new DateTime($date);
$dateAdd->add(new DateInterval('P1D'));
$check_date = $dateAdd->format('Y-m-d');
}
//LAST Date กรณีครบรอบ วันที่สุดท้ายยังไม่ได้ถูกเซ็ตเข้าไปใน Array ให้เพิ่มเข้าไปตำแหน่งก่อนหน้านี้เลย
if($prev_date != ''){
$results[$no-1] .= ' - ' . $prev_date;
}else{
$results[$no-1] .= ' ' . $prev_year;
}
$check_date = '';//วันที่ถัดไป สำหรับตรวจสอบ
$prev_date = '';
$prev_year = 0;
$start_year = 0;
$no = 0;
foreach($all_date as $date){
$arr = explode('-', $date);
$new = $arr[2] . ' ' . $short_month[$arr[1]];
if($date != $check_date){//ถ้าวันที่ถัดไป ไม่ตรงกันแสดงว่าไม่ต่อเนื่อง
$results[$no] = $new;// ให้เซ็ตวันที่ใหม่เข้าไปใน Array
$current_year = ($arr[0]+543);
$year = '';
if($start_year != $prev_year){// ตรวจสอบปี ว่ามีการข้ามปีหรือไม่
$year = ' ' . $start_year;//ถ้าข้ามปี ให้เอาปีเก่า ต่อไปในวันที่แรก ก่อนจะเพิ่มวันทีสุดท้ายเข้าไป
}
// Set Last of prev array
if($no > 0){
if($prev_date != ''){//มีการกำหนดค่าวันที่ตรวจสอบก่อนหน้านี้ เมื่อไม่ต่อเนื่องกัน ให้แทรกไปยัง Array ตัวก่อนหน้า
$results[$no-1] .= $year . ' - ' . $prev_date;
$prev_date = '';//Reset
}else{//แต่ถ้าก่อนหน้านั้น ไม่ใช่วันที่ต่อเนื่องจะไม่มีการเก็บวันที่ ให้แทรก ปีต่อท้าย Array ก่อนหน้าไปเลย
$results[$no-1] .= ' ' . $prev_year;
}
}
//echo '<br>year : ', $start_year , ', ' , $current_year;
$start_year = $current_year;
$no++;
}else{ //ถ้าวันที่ยังต่อเนื่องกันอยู่ เก็บวันปัจจุบันเอาไว้ ต่อท้ายกรณีเปลี่ยนค่าไม่ต่อเนื่อง
$prev_date = $new . ' ' . ($arr[0]+543);
$new = '';
}
//echo '<br/>Current '. $date , ' != '. ($date != $check_date) .' : ' , $check_date.', ' , $new;
//สร้างวันที่ถัดไป เพื่อใช้ตรวจสอบความต่อเนื่อง
$prev_year = ($arr[0]+543);
$dateAdd = new DateTime($date);
$dateAdd->add(new DateInterval('P1D'));
$check_date = $dateAdd->format('Y-m-d');
}
//LAST Date กรณีครบรอบ วันที่สุดท้ายยังไม่ได้ถูกเซ็ตเข้าไปใน Array ให้เพิ่มเข้าไปตำแหน่งก่อนหน้านี้เลย
if($prev_date != ''){
$results[$no-1] .= ' - ' . $prev_date;
}else{
$results[$no-1] .= ' ' . $prev_year;
}
<!DOCTYPE html>
<html>
<head>
<title><?php echo $web_title;?></title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>
<body>
<h1><?php echo $web_title;?></h1>
<p>วันที่ระหว่าง <?php echo $start_date . ' - ' . $end_date . ' ห่างกัน ' . $diff;?> วัน</p>
<h1>มาหาวันที่ต่อเนื่องกัน</h1>
<?php echo implode(', ', $all_date);?>
<p><strong>ผลลัพธ์ที่ต้องการ </strong></p>
28 ก.พ. - 2 มี.ค. 2561<br/>
7 มี.ค. 2561<br/>
9 มี.ค. 2561<br/>
12 มี.ค. - 15 มี.ค. 2561<br/>
<p><strong>ผลลัพธ์ที่ได้ </strong></p>
<pre style="background-color : #efefef; padding : 10px">
<?php print_r($results);?>
</pre>
</body>
</html>
ผลลัพธ์ที่ได้
ต้องการซอร์สโค้ดฉบับเต็มคลิกที่นี่ Donate
แล้ว Inbox มาในเพจนะครับ
ความคิดเห็น
แสดงความคิดเห็น