이제 처음에 작성했던 다음 코드와
<!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>
'PHP' 카테고리의 다른 글
[PHP] $i++ 과 ++$i 의 차이 (0) | 2018.06.21 |
---|---|
[PHP] 에러메시지 Undefined offset 의미 (0) | 2018.06.20 |
[PHP] 바이너리 서치로 인덱스 필드값 찾기 (0) | 2018.05.15 |
[PHP] 회원들의 재구매율 알아보기(3) - 날짜 계산하기 strtotime() (0) | 2017.09.26 |
[PHP] 회원들의 재구매율 알아보기(2) - 두 배열 비교하기 in_array() (0) | 2017.09.25 |
[PHP] 회원들의 재구매율 알아보기(1) - MySQL 컬럼(열)을 배열로 만들기 (0) | 2017.09.24 |
[PHP] mysqli_fetch_row, assoc, array 의 차이 (4) | 2017.09.20 |
[PHP] DB에서 특정 행들만 가져오기(8) - DB 에서 열 이름 가져오기 (0) | 2017.09.19 |
[PHP] DB에서 특정 행들만 가져오기(7) - DB에서 가져온 정보 출력하기 mysqli_fetch_row() (0) | 2017.09.18 |
[PHP] DB에서 특정 행들만 가져오기(6) - 쿼리 작성하기 mysqli_query() (0) | 2017.09.17 |
댓글