เชียงรายโฟกัสดอทคอม สังคมออนไลน์ของคนเชียงราย ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
วันที่ 19 เมษายน 2024, 19:48:34
หน้าแรก ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก



  • ข้อมูลหลักเว็บไซต์
  • เชียงรายวันนี้
  • ท่องเที่ยว-โพสรูป
  • ตลาดซื้อขายสินค้า
  • ธุรกิจบริการ
  • บอร์ดกลุ่มชมรม
  • อัพเดทกระทู้ล่าสุด
  • อื่นๆ

ประกาศ !! กรุณาอ่านเพื่อทำความเข้าใจ : https://forums.chiangraifocus.com/index.php?topic=1025412.0

+  เว็บบอร์ด เชียงรายโฟกัสดอทคอม สังคมออนไลน์ของคนเชียงราย
|-+  ศูนย์กลางข้อมูลเชียงราย
| |-+  คุยเรื่องไอที - เทคโนโลยี (ผู้ดูแล: K€nGja1, chiohoh, nuifish, NOtis)
| | |-+  [มุมโปรแกรมเมอร์] PHP นำข้อมูล Array วันที่ หลายๆวัน มาหาช่วงวันที่ต่อเนื่อง
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
« หน้าที่แล้ว ต่อไป »
หน้า: [1] พิมพ์
ผู้เขียน [มุมโปรแกรมเมอร์] PHP นำข้อมูล Array วันที่ หลายๆวัน มาหาช่วงวันที่ต่อเนื่อง  (อ่าน 1027 ครั้ง)
{Cyberman}
To Be Developer
มัธยม
**
ออฟไลน์ ออฟไลน์

กระทู้: 504


โปรแกรมเมอร์เชียงราย


« เมื่อ: วันที่ 28 มีนาคม 2018, 22:42:53 »

ประกาศค่าตัวแปรวันที่

โค๊ด:
$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;
 }


ส่วนของการแสดงผล

โค๊ด:
<!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>


ผลลัพธ์ที่ได้




ที่มา
http://phpcodemania.blogspot.com/2018/02/php-array-date-range.html
« แก้ไขครั้งสุดท้าย: วันที่ 28 มีนาคม 2018, 22:46:54 โดย {Cyberman} » IP : บันทึกการเข้า

หน้า: [1] พิมพ์ 
« หน้าที่แล้ว ต่อไป »
กระโดดไป:  


เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

 
เรื่องที่น่าสนใจ
 

ข้อความที่ท่านได้อ่านบนกระดานข่าวแห่งนี้ เกิดขึ้นจากการเขียนโดยสาธารณชน และตีพิมพ์แบบอัตโนมัติ ผู้ดูแลเว็บไซต์แห่งนี้ไม่จำเป็นต้องเห็นด้วย
และไม่รับผิดชอบต่อข้อความใดๆ ผู้อ่านจึงต้องใช้วิจารณญาณในการกลั่นกรองด้วยตัวเอง และถ้าท่านพบเห็นข้อความใดๆ ที่ขัดต่อกฎหมาย และศีลธรรม พาดพิง ละเมิดสิทธิบุคคอื่น ต้องการแจ้งลบ
กรุณาส่งลิงค์มาที่
เพื่อทีมงานจะได้ดำเนินการลบออกให้ทันที..."

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
www.chiangraifocus.com

Valid XHTML 1.0! Valid CSS!