1년동안 주차와 전년도 주차와 비교하기

고객이 검색한 년도의 1년동안의 매월 주를 계산을 하고 나서 기간에 따른 Row 갯수를 그래프에 표현을 하고 싶어 하기에 작성하게 된 것입니다. 조금은 난해하게 보이지만은 조건 검사가 많은 편이지 그다지 복잡한 코드는 아닙니다.

$end_yearmonthday = date("Y-m-d", strtotime($_GET['end_year'].'-'.$_GET['end_month'].'-'.$_GET['end_day']));


// 이전년도
$agoTime = date('Y-m-d', strtotime(date('Y-01-01', strtotime($end_yearmonthday)).' -1 years'));
$agoMaxWeek = date('W', strtotime(date('Y-12-31', strtotime($end_yearmonthday)).' -1 years'));
$monthCnt = 0;
$historyMonth = 0;
for($w = 0; $w <= $agoMaxWeek; $w++) { 
	$thisWeek = date('W', strtotime( $agoTime .' +'.$w.' week') );
	$thisYear = date('Y', strtotime( $agoTime .' +'.$w.' week') );
	$thisMonth = date('m', strtotime( $agoTime .' +'.$w.' week') );
	$thisDay = date('d', strtotime( $agoTime .' +'.$w.' week') );
	$dayOfTheWeek = date('w',mktime(0,0,0,$thisMonth,$thisDay,$thisYear));

	// 해당주차의 시작 날짜
	$today_week_sday1  = mktime(0,0,0,$thisMonth,$thisDay-$dayOfTheWeek,$thisYear);
	$today_week_sday2 = date("Y-m-d",$today_week_sday1);

	// 해당주차의 종료 날짜
	$today_week_eday1 = mktime(23,59,59,$thisMonth,$thisDay+(6-$dayOfTheWeek),$thisYear);
	$today_week_eday2 = date("Y-m-d",$today_week_eday1);

	//
	if( $historyMonth == $thisMonth) {
		$monthCnt++;
	} else {
		$monthCnt = 1;
	}

	$historyMonth =  $thisMonth;

	// 배열에 저장
	$graphDateArr[$thisYear][$thisMonth][$monthCnt]['sdate'] = $today_week_sday2; 
	$graphDateArr[$thisYear][$thisMonth][$monthCnt]['edate'] = $today_week_eday2;
	$graphDateArr[$thisYear][$thisMonth][$monthCnt]['item'] = $itemRes['cnt'];
	$graphDateArr[$thisYear][$thisMonth][$monthCnt]['detail'] = $itemDetailRes['cnt'];
}


// 당해 년도
$defaultTime = date('Y-m-d', strtotime(date('Y-01-01', strtotime($end_yearmonthday))));
$defaultMaxWeek = date('W', strtotime(date('Y-12-31', strtotime($end_yearmonthday))));
$monthCnt = 0;
$historyMonth = 0;
for($w = 0; $w <= $defaultMaxWeek; $w++) { 
	$thisWeek = date('W', strtotime( $defaultTime .' +'.$w.' week') );
	$thisYear = date('Y', strtotime( $defaultTime .' +'.$w.' week') );
	$thisMonth = date('m', strtotime( $defaultTime .' +'.$w.' week') );
	$thisDay = date('d', strtotime( $defaultTime .' +'.$w.' week') );
	$dayOfTheWeek = date('w',mktime(0,0,0,$thisMonth,$thisDay,$thisYear));

	// 해당주차의 시작 날짜
	$today_week_sday1  = mktime(0,0,0,$thisMonth,$thisDay-$dayOfTheWeek,$thisYear);
	$today_week_sday2 = date("Y-m-d",$today_week_sday1);

	// 해당주차의 종료 날짜
	$today_week_eday1 = mktime(23,59,59,$thisMonth,$thisDay+(6-$dayOfTheWeek),$thisYear);
	$today_week_eday2 = date("Y-m-d",$today_week_eday1);

	//
	if( $historyMonth == $thisMonth) {
		$monthCnt++;
	} else {
		$monthCnt = 1;
	}

	$historyMonth =  $thisMonth;

	// 배열에 저장
	$graphDateArr[(INT)$thisYear][(INT)$thisMonth][$monthCnt]['sdate'] = $today_week_sday2; 
	$graphDateArr[(INT)$thisYear][(INT)$thisMonth][$monthCnt]['edate'] = $today_week_eday2;
	$graphDateArr[(INT)$thisYear][(INT)$thisMonth][$monthCnt]['item'] = ceil($itemRes['cnt']);
	$graphDateArr[(INT)$thisYear][(INT)$thisMonth][$monthCnt]['detail'] =  $itemDetailRes['cnt'];
}

2번 돌아가는 이유는 당해, 전년이 서로 주자의 기간이 다르기때문에 별도로 계산을 해서 나오도록 처리를 하기 위해서 입니다.

해당 값을 배열에 담아서 빼서 사용을 하면 되기에 나중에 그래프에 Data를 표현할때 뽑아서 사용만 하면 됩니다.

<완성 화면>

위에 화면 캡쳐본 처럼 나오기 위해서 상단에서 복잡하게 계산을 하고 모두 배열에 담아 두게 되는것입니다. 곳곳에서 사용을 하기 위해서 필요한 부분이기도 하면서 단순하지만 수고가 들어가는 작업이었습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다