[PHP] 회원들의 재구매율 알아보기(4) - 완성
이제 처음에 작성했던 다음 코드와
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php $query = "SELECT distinct user_id FROM `user_data` WHERE date>='2017-01-01' and date<'2017-02-01';"; $result = mysqli_query($conn, $query); $array_1 = array(); for($i = 0; $row = mysqli_fetch_row($result); $i = $i + 1){ $array_1[$i] = $row[0]; } //첫번째 달 구매자 목록 $query = "SELECT distinct user_id FROM `user_data` WHERE date>='2017-02-01' and date<'2017-03-01';"; $result = mysqli_query($conn, $query); $array_2 = array(); for($i = 0; $row = mysqli_fetch_row($result); $i = $i + 1){ $array_2[$i] = $row[0]; } //두번째 달 구매자 목록 for($i = 0, $value = 0; $i < count($array_1); $i++){ $value = $value + in_array($array_1[$i], $array_2); } //목록 비교
echo count($array_1)," | ",$value," | ",$value/count($array_1); //출력 ?> </body> </html>
strtotime() 에서 만들었던 다음 코드를 합치면 되겠다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<?php
for($i=0; $i<5; $i++){
$date_array = array();
for($j=0; $j<3; $j++){
$date = strtotime("2017-01-01 +$i month +$j month");
$date_array[$j] = date("Y-m-d", $date);
}//한달뒤, 두달뒤로 날짜 세팅
$query = "SELECT distinct user_id FROM `user_data` WHERE date>='%s' and date<'%s';";
echo sprintf($query, $date_array[0], $date_array[1]), "</BR>";
echo sprintf($query, $date_array[1], $date_array[2]), "</BR></BR>";
//쿼리
}
?>
</body>
</html>
합치고 sprintf 부분을 mysqli_query 안으로 넣은 결과는 다음과 같다.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php for($i=0; $i<5; $i++){ $date_array = array(); for($j=0; $j<3; $j++){ $date = strtotime("2017-01-01 +$i month +$j month"); $date_array[$j] = date("Y-m-d", $date); } //한달뒤, 두달뒤로 날짜 세팅 $query = "SELECT distinct user_id FROM `user_data` WHERE date>='%s' and date<'%s';"; //쿼리 $result = mysqli_query($conn, sprintf($query, $date_array[0], $date_array[1])); $array_1 = array(); for($j = 0; $row = mysqli_fetch_row($result); $j++){ $array_1[$j] = $row[0]; } //첫번째 달 구매자 목록 $result = mysqli_query($conn, sprintf($query, $date_array[1], $date_array[2])); $array_2 = array(); for($j = 0; $row = mysqli_fetch_row($result); $j++){ $array_2[$j] = $row[0]; } //두번째 달 구매자 목록 for($j = 0, $value = 0; $j < count($array_1); $j++){ $value = $value + in_array($array_1[$j], $array_2); } //목록 비교 echo count($array_1)," | ",$value," | ",$value/count($array_1),"</br>"; //출력 } ?> </body> </html>
전체 for 문에 $i 를 사용하고 있으므로 안의 반복문은 $j 로 바꾸어주었다.
일단 실행해 보자.
결과를 볼 수 있다.
결과가 5개인 것은 전체 for 문에 $i < 5 로 조건을 주었기 때문이다.
첫번째 달 구매자 목록과 두번째 달 구매자 목록을 구하는 코드에 중복이 많으므로
다음과 같이 반복문을 사용해 줄일 수도 있겠다.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php for($i=0; $i<5; $i++){ $date_array = array(); for($j=0; $j<3; $j++){ $date = strtotime("2017-01-01 +$i month +$j month"); $date_array[$j] = date("Y-m-d", $date); } //한달뒤, 두달뒤로 날짜 세팅 $query = "SELECT distinct user_id FROM `user_data` WHERE date>='%s' and date<'%s';"; //기본쿼리 for($k=0; $k<2; $k++){ $result = mysqli_query($conn, sprintf($query, $date_array[$k], $date_array[$k+1])); ${'array_'.$k} = array(); for($j = 0; $row = mysqli_fetch_row($result); $j++){ ${'array_'.$k}[$j] = $row[0]; } } //첫번째와 두번째 달 구매자 목록 for($j = 0, $value = 0; $j < count($array_0); $j++){ $value = $value + in_array($array_0[$j], $array_1); } //목록 비교 echo count($array_0)," | ",$value," | ",$value/count($array_0),"</br>"; //출력 } ?> </body> </html>
${'array_'.$k} 는 $k = 0 일 때 $array_0 이라는 배열명을, $k = 1 일때 $array_1 이라는 배열명을 만든다.
이제 보기 쉽게 표 형식으로 다듬고 앞에 해당 달도 출력하자.
<?php $conn = mysqli_connect("localhost", "root", "123456789"); mysqli_select_db($conn, "test"); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php for($i=0; $i<5; $i++){ $date_array = array(); for($j=0; $j<3; $j++){ $date = strtotime("2017-01-01 +$i month +$j month"); $date_array[$j] = date("Y-m-d", $date); } //한달뒤, 두달뒤로 날짜 세팅 $query = "SELECT distinct user_id FROM `user_data` WHERE date>='%s' and date<'%s';"; //기본쿼리 for($k=0; $k<2; $k++){ $result = mysqli_query($conn, sprintf($query, $date_array[$k], $date_array[$k+1])); ${'array_'.$k} = array(); for($j = 0; $row = mysqli_fetch_row($result); $j++){ ${'array_'.$k}[$j] = $row[0]; } } //첫번째와 두번째 달 구매자 목록 for($j = 0, $value = 0; $j < count($array_0); $j++){ $value = $value + in_array($array_0[$j], $array_1); } //목록 비교 echo "<TR><TD>",$date_array[0],"</TD><TD>",count($array_0),"</TD><TD>",$value, "</TD><TD>",$value/count($array_0),"</TD></TR>"; //출력 } ?> </body> </html>
결과는 다음과 같다.
만일 (년 - 월)까지만 표현하고 싶다면 $date_array[0] 부분의 문자열을 왼쪽에서 7번째까지만 자르면 되겠다.
substr() 함수가 사용되며, 사용법은 substr(문자열, 시작위치, 길이) 와 같다.
그러므로 echo 부분의 $date_array[0] 부분을 다음과 같이 바꾸어 적으면
substr($date_array[0], 0, 7)
아래와 같은 결과를 얻을 수 있다.
숫자의 표기 형식은 number_format() 함수에서 바꿀 수 있으며,
사용법은 number_format(숫자, 반올림 위치, 소수점 표기, 천의 자리 표기) 와 같다.
재구매율 부분을 퍼센트로 바꾸기 위해 x100 하고, 소수점 이하 한자리까지 반올림하자.
다음과 같이 적으면 되겠다.
number_format($value*100/count($array_0), 1, '.' , ','), "%</TD></TR>";
소수점 표기는 '.' 로, 천의 자리 표기는 ',' 로 하라는 의미이다.
결과는 다음과 같다.
마지막으로 열이름을 추가하자.
HTML 문법에 따라 다음과 같이 BODY 태그에 넣어주면 되겠다.
<TR><TD>년-월</TD><TD>당월구매자</TD><TD>당월구매자 중 익월구매자</TD><TD>재구매율</TD></TR>
완성된 코드와 결과는 다음과 같다.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <table border=1> <TR><TD>년-월</TD><TD>당월구매자</TD><TD>당월구매자 중 익월구매자</TD><TD>재구매율</TD></TR> <?php for($i=0; $i<5; $i++){ $date_array = array(); for($j=0; $j<3; $j++){ $date = strtotime("2017-01-01 +$i month +$j month"); $date_array[$j] = date("Y-m-d", $date); } //한달뒤, 두달뒤로 날짜 세팅 $query = "SELECT distinct user_id FROM `user_data` WHERE date>='%s' and date<'%s';"; //기본쿼리 for($k=0; $k<2; $k++){ $result = mysqli_query($conn, sprintf($query, $date_array[$k], $date_array[$k+1])); ${'array_'.$k} = array(); for($j = 0; $row = mysqli_fetch_row($result); $j++){ ${'array_'.$k}[$j] = $row[0]; } } //첫번째와 두번째 달 구매자 목록 for($j = 0, $value = 0; $j < count($array_0); $j++){ $value = $value + in_array($array_0[$j], $array_1); } //목록 비교 echo "<TR><TD>",substr($date_array[0], 0, 7),"</TD><TD>",count($array_0),"</TD><TD>",$value,"</TD><TD>", number_format($value*100/count($array_0), 1, '.', ','),"%</TD></TR>"; //출력 } ?> </table> </body> </html>