본문 바로가기
PHP

[PHP] 회원들의 재구매율 알아보기(4) - 완성

by LightBlogger 2017. 10. 13.

이제 처음에 작성했던 다음 코드와


<!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>





반응형

댓글