사이트 내 전체검색
PHP
[php] 답글처리 알고리즘
로빈아빠
https://cmd.kr/php/464 URL이 복사되었습니다.

본문

답글처리 알고리즘

현 포럼에 있는 답글 알고리즘 v 1.1 하고 비슷한 내용입니다.

예를들어 설명들어

글제목 입력날짜
원글3 07/04
__답글1 07/05
원글2 07/02
원글1 07/01
__답글1 07/02
____답글1의 답글2 07/04
____답글1의 답글1 07/03
__답글2 07/03

처럼 보여지는 답글처리방식을 많이 사용합니다. 안 이상한가요? 전 이상한데...

이유는 바로 6번째줄에 있습니다. 분명 원글은 최근글이 위로 올라온느게 맞습니다. 그러나 답글은 아래로 정렬되어야 하죠.

그런데 많은 알고리즘은 '답글에 답글'이달리면 하나일땐 상관없는데 '답글1에 답글1', '답글1에 답글2' 처럼 2레벨 답글이 여러개 달리면 '원글은 최근글이 위로, 답글은 최근글이 아래로...'라는 원칙(?)이 깨지게 됩니다. 머 그런 방식을 좋아하는 사람도 많습니다만...

암튼 토론을 위한 게시판 등이라면 이건 아주 헷갈리는 목록이 될수밖에 없습니다.

그래서 아래처럼 바꾸어야 할 필요성이 대두되었습니다.

글제목 입력날짜
원글3 07/04
__답글1 07/05
원글2 07/02
원글1 07/01
__답글1 07/02
____답글1의 답글1 07/03
____답글1의 답글2 07/04
__답글2 07/03

이렇게 만들면 좋은점이 또하나 있습니다.

바로 단계별 의견수렴을 할수 있다는 거죠.

어떤글에 대해서 누군가가 연관된 답변을 했다면 제 3의 인물이 그 원글과 답글에 대해서 이어서 답변을 달고 다시 답변을 다는 식으로 답변들이 일관되게 흐름을 유지할수 있습니다.

그러다가 그 흐름과는 별도의 의견이 제기될수도 있는데... 그때 바로 추가 답변이 필요해지는거죠. 물론 그 답변에도 흐름이 생기겠죠.

결국 하나의 문제에서 파생된 여러가지 사람들이 생각 흐름을 알수 있다는 거죠.

* 저도 이 문제를 phpschool에서 찾아보고 해결했습니다.
* 토론까지 벌어졌더군요.
* 암튼 제가 선택한 방식은 phpschool에 문승택님이 설명한 방식을 사용했습니다.

uid : 글 고유번호 필드 (자동증가)
num : 외부에 보여질 글 번호 필드
reno : 실제 글 정렬에 필요한 필드 (속성 text)
rede : 글 깊이 지정 필드 <---전 이넘으로 답변글을 순차적으로 보여지게 하였습니다.

쓰기처리>
$num의 값( max(num)+1 ) 을 구하여 $reno와 $num에 똑같이 넣고 $rede는 0 을 넣었습니다.

답글처리>
원글의 $num, $reno, $rede를 구해놓고 지금 들어갈 글의 고유번호 $new_uid를 구해놓습니다.
이역시 max(uid)+1를 이용했습니다.
그리고 $new_uid의 자릿수를 맞추기위해 $new_uid = sprintf("%06.0d", $uid); 로 처리했습니다.
다음으로 $num, $reno, $rede 에 들어갈 값들을 $new_num=$num, $new_reno=$reno."-".$new_uid, $new_rede=$rede+1로 만들어 넣었습니다.

관련글 보기처리>
$reno에 들어 있는 내용을 "-"를 기준으로 잘라 배열을 만들었습니다. 그리곤 $rede의 값으로 배열 위치를 잡아 값을 뽑아내어 검색으로 돌려버렸습니다.
$arr_reno=explode("-", $reno) ; $next_reno=arr_reno[$rede] ;
SELECT * FROM table where num = $num and reno like '%$next_reno%' ORDER BY num DESC, reno

머 아직 조금은 더 테스트 해봐야겠지만 아주 만족한 결과를 얻었다고 생각됩니다.

참 관련글들을 읽는중에 원글을 보아야할 필요가 있을땐 간단히 SELECT uid FROM table where num=$num 해주면 됩니다. 모든 관련글들의 번호는 같으니까요. 머 정렬이야 기본적으로 asc니까...

댓글목록

등록된 댓글이 없습니다.

PHP
871 (7/18P)

Search

Copyright © Cmd 명령어 18.224.64.10