> 백엔드 개발 > PHP 튜토리얼 > PHP는 양방향 순환 큐를 구현합니다 --- (기록 레코드의 앞으로 및 뒤로 기능 구현)

PHP는 양방향 순환 큐를 구현합니다 --- (기록 레코드의 앞으로 및 뒤로 기능 구현)

WBOY
풀어 주다: 2016-07-25 09:06:55
원래의
982명이 탐색했습니다.
작업 이력 기록 기능 구현


  1. 실행 취소 및 실행 취소 기능과 유사한 기능입니다. (정방향 및 역방향 연산 구현)
  2. discuz 포럼에 로그인하면 게시물을 볼 수 있습니다. (지금까지 본 게시물과 게시물 조회 기록을 앞뒤로 이동할 수 있습니다.)
  3. Windows 탐색기 주소 표시줄의 앞으로 및 뒤로 기능과 논리는 동일합니다.


이러한 요구를 바탕으로 데이터 구조가 구현됩니다. 나는 일시적으로 역사 수업이라고 불리는 일반 수업을 썼습니다.
[원리는 시계와 비슷합니다. 객체를 인스턴스화할 때 길이가 N(필요에 따라 결정될 수 있음) 노드로 링을 구성할 수 있습니다.]
그런 다음 다양한 작업을 통합하세요. 앞으로, 뒤로, 삽입, 삽입 수정.

클래스는 배열을 구성할 수 있습니다. 또는 배열 매개변수를 전달하여 객체를 생성합니다. 각 작업이 끝나면 작업 후 배열을 얻을 수 있습니다. 완성된 데이터 는 필요에 따라 적절한 방법으로 저장할 수 있습니다. 쿠키나 세션에 넣거나, 직렬화하거나, json 데이터로 변환하여 데이터베이스에 저장하거나, 파일로 담아두는 것입니다. 다음번 사용에도 편리합니다.

확장을 촉진하려면 더 많은 데이터를 저장하세요. 특히 각 데이터 조각은 배열 레코드이기도 합니다.
예를 들어 필요에 따라 확장합니다: array('path'=>'D:/www/','sss'=>value)

---------- -------------


그런데 제가 작성한 변수 디버깅용 파일을 올려 놓았습니다.

  1. pr()은 출력 변수의 형식을 지정하고 강조 표시할 수 있습니다. pr($arr),pr($arr,1)은 출력 후 종료됩니다.
  2. debug_out()은 여러 변수를 출력하는 데 사용됩니다. 기본값은 종료하는 것입니다.
  3. debug_out($_GET,$_SERVER,$_POST,$arr) ;
  1. include 'debug.php';
  2. /**
  3. * 히스토리 연산 클래스
  4. * 배열을 전달하거나 구성합니다. 형식:
  5. array(
  6. 'history_num'=>20, //총 대기열 노드 수
  7. 'first'=>0, //시작 위치, 0부터 시작. 배열 인덱스 값
  8. 'last'=>0, //끝 위치는 0부터 시작합니다.
  9. 'back'=>0, //첫 번째 위치에서 몇 걸음 뒤로 이동했는지 =>array( //배열, 작업 대기열을 저장합니다.
  10. array('path'=>'D:/'),
  11. array('path'=>'D:/www/') ,
  12. array('path'=>'E:/'),
  13. array('path'=>'/home/')
  14. ……
  15. )
  16. )
  17. */
  18. 클래스 역사{
  19. var $history_num;
  20. var $first;
  21. var $last;
  22. var $back;
  23. var $history=array();
  24. 함수 __construct( $array=array(),$num=12){
  25. if (!$array) {//배열이 비어 있습니다.
  26. $history=array();
  27. for ($i=0; $i < $num; $i ) {
  28. array_push($history,array('path'=>'') );
  29. }
  30. $array=array(
  31. 'history_num'=>$num,
  32. 'first'=>0,//시작 위치
  33. 'last'=> ; 0,//위치 끝
  34. 'back'=>0,
  35. 'history'=>$history
  36. );
  37. }
  38. $this->history_num=$array [ 'history_num'];
  39. $this->first=$array['first'];
  40. $this->last=$array['last'];
  41. $this-> =$array['back'];
  42. $this->history=$array['history']
  43. }
  44. function nextNum($i,$n=1){ / 루프 아래의 /N 값. 클럭 루프와 유사합니다.
  45. return ($i $n)<$this->history_num ? ($i $n):($i $n-$this->history_num);
  46. }
  47. 함수 prevNum( $i,$n=1){//루프의 마지막 값 i입니다. N 위치로 돌아갑니다.
  48. return ($i-$n)>=0 ? ($i-$n) : ($i-$n $this->history_num)
  49. }
  50. 함수 마이너스 ($i,$j){//두 시계 방향 지점의 유일한 차이점은 i-j
  51. return ($i > $j) ? ($i - $j):($i-$j $this-> ; History_num);
  52. }
  53. 함수 getHistory(){//저장 또는 직렬화 작업에 사용되는 배열을 반환합니다.
  54. return array(
  55. 'history_num'=> $this->history_num,
  56. 'first' => $this->first,
  57. 'last' => $this- >마지막,
  58. '뒤로' => $this->뒤로,
  59. '역사' => $this->history
  60. );
  61. }
  62. function add($path){
  63. if ($this->back!=0) {//back 작업 기록이 있으면 삽입합니다.
  64. $this->goedit($path);
  65. return;
  66. }
  67. if ($this->history[0]['path']=='') {// 방금 생성되었으므로 추가할 필요가 없습니다.
  68. $this->history[$this->first]['path']=$path;
  69. return;
  70. }else{
  71. $this->first=$this->nextNum($this->first);//첫 번째 위치를 앞으로 이동
  72. $this->history[$this-> first]['path'] =$path;
  73. }
  74. if ($this->first==$this->last) {//시작 위치와 끝 위치가 만납니다
  75. $ this->last=$this ->nextNum($this->last);//끝 위치를 앞으로 이동합니다.
  76. }
  77. }
  78. function goback(){//처음부터 N단계 전의 주소를 반환합니다.
  79. $this->back =1;
  80. //최대 뒤로 이동할 수 있는 단계는 시작점과 끝점의 차이(시계 방향 차이)입니다.
  81. $mins=$this->minus ($this-> ;first,$this->last);
  82. if ($this->back >= $mins) {//마지막 지점으로 돌아가기
  83. $this->back =$mins;
  84. }
  85. $pos=$this->prevNum($this->first,$this->back);
  86. return $this->history[ $pos]['path '];
  87. }
  88. function gonext(){//N이 처음에서 뒤로 물러난 곳에서 한 걸음 앞으로 나아갑니다.
  89. $this->back-=1;
  90. if ($this->back<0) {//마지막 지점으로 돌아가기
  91. $this->back=0;
  92. }
  93. return $this->history[$this->prevNum($this->first,$this->back)]['path'];
  94. }
  95. 함수 goedit( $ path){//앞으로가 아니라 수정된 특정 지점으로 돌아갑니다.전나무 값은 마지막 값입니다.
  96. $pos=$this->minus($this->first,$this->back);
  97. $pos=$this->nextNum($pos);//다음
  98. $this->history[$pos]['path']=$path;
  99. $this->first=$pos;
  100. $this->back=0;
  101. }
  102. //돌아갈 수 있나요?
  103. function isback(){
  104. if ($this->back < $this->minus($this->first,$this- > ;last)) {
  105. return ture;
  106. }
  107. return false;
  108. }
  109. //앞으로 나아갈 수 있나요
  110. function isnext(){
  111. if ($this -> ;back>0) {
  112. return true;
  113. }
  114. return false;
  115. }
  116. }
  117. //테스트 코드.
  118. $hi=new History(array(),6);//빈 배열을 전달하여 배열 구성을 초기화합니다.
  119. for ($i=0; $i $hi->add('s'.$i)
  120. }
  121. pr($hi- >goback());
  122. pr($hi->goback());
  123. pr($hi->goback());
  124. pr($hi-> goneext());
  125. pr($hi->gonext());
  126. pr($hi->gonext());
  127. pr($hi->gonext());
  128. $hi->add('asdfasdf');
  129. $hi->add('asdfasdf2');
  130. pr($hi->getHistory());
  131. $ss=new History($hi->getHistory());//배열로 직접 구성됩니다.
  132. $ss->add('asdfasdf');
  133. $ss->goback();
  134. pr($ss->getHistory());
  135. ?>
코드 복사
  1. /**
  2. * 변수 이름 가져오기
  3. * 예 hello="123" ss 문자열 가져오기
  4. */
  5. function get_var_name(&$aVar){
  6. foreach($GLOBALS를 $로 표시 key=>$var)
  7. {
  8. if($aVar==$GLOBALS[$key] && $key!="argc"){
  9. return $key;
  10. }
  11. }
  12. }
  13. /**
  14. * 형식화된 출력 변수 또는 객체
  15. * @param Mixed $var
  16. * @param boolean $exit
  17. */
  18. function pr($var,$exit = false){
  19. ob_start();
  20. $style='< 스타일>
  21. pre#debug{margin:10px;font-size:13px;color:#222;font-family:Consolas ;line-height:1.2em;배경:#f6f6f6;border-left:5px solid #444 ;padding:5px;width:95%;word-break:break-all;}
  22. pre#debug b{font-weight:400;}
  23. #debug #debug_str{color:#E75B22;}
  24. #debug #debug_keywords{font-weight:800;color:00f;}
  25. #debug #debug_tag1{color:#22f;}
  26. #debug #debug_tag2{color:#f33;font-weight:800; }
  27. #debug #debug_var{color:#33f;}
  28. #debug #debug_var_str{color:#f00;}
  29. #debug #debug_set{color:#0C9CAE;}';
  30. if (is_array($var)){
  31. print_r($var);
  32. }
  33. else if (is_object($var)){
  34. echo get_class($var)." 개체 ";
  35. }
  36. else if(is_resource($var)){
  37. echo (string)$var;
  38. }
  39. else{
  40. echo var_dump($var);
  41. }
  42. $out = ob_get_clean();//$out 변수에 대한 버퍼 출력
  43. $out=preg_replace('/"(.*)"/','"'.'\1'.'"',$out);//문자열 변수 강조 표시
  44. $out=preg_replace('/=>(.*)/' ,' =>'.''.'\1'.'',$out);//=>
  45. $out= 뒤의 값 강조 표시 preg_replace('/[(.*)]/','['.'\1'. '< /b>]',$out);//변수 강조
  46. $from = array(' ','(' ,')' ,'=>');
  47. $to = array(' ','(',') ','=>');
  48. $out=str_replace($from,$to,$out)
  49. $keywords=array('Array','int','string','class','object','null');//키워드 강조
  50. $keywords_to=$ 키워드;
  51. foreach ($keywords as $key=>$val)
  52. {
  53. $keywords_to[$key] = ''.$val.'< ;/b>';
  54. }
  55. $out=str_replace($keywords,$keywords_to,$out)
  56. echo $style.'
    <b id ="debug_keywords"> '.get_var_name($var).'</b> = '.$out.'
    ';
  57. if ($exit) exit;//true인 경우 종료
  58. }
  59. /**
  60. * 디버그 출력 변수, 개체 값.
  61. * 임의 개수의 매개변수(모든 유형의 변수)
  62. * @return echo
  63. */
  64. function debug_out(){
  65. $avg_num = func_num_args();
  66. $avg_list= func_get_args();
  67. ob_start();
  68. for ($i=0; $i pr($avg_list[$i]);
  69. }
  70. $out=ob_get_clean() ;
  71. echo $out ;
  72. 종료;
  73. }
  74. ?>
코드 복사


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿