php實作雙向循環佇列--- (實作歷史記錄的前進後退等功能)

WBOY
發布: 2016-07-25 09:06:55
原創
954 人瀏覽過
複製程式碼🎜>?>
實現一個記錄操作歷史的功能


  1. 和撤銷,反撤銷功能類似的一個功能。 (實現操作的前進後退)
  2. 和discuz論壇登入後查看帖子(可以前進後退查看過的帖子,還有帖子查看歷史記錄)
  3. 邏輯和windows資源管理器網址列前進後退功能一樣。


根據這種需要,實作了一個資料結構。寫了一個通用的類,暫叫歷史記錄類吧。
【原理和時鐘類似。實例化物件時可以建構長度為N(可依需要定長度)個節點的環】
然後整合各種操作。前進、後退、插入、修改插入。

類別可以建構一個陣列。或傳入數組參數建構一個物件。 每次操作之後可以取得操作後的陣列。 操作完的 資料可以依照自己的需求以適當的方式保存。 放在cookie,session裡面,或是序列化,或轉為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開始。 //數組,存放操作佇列。 path'=>'E:/'),
  9. array('path'=>'/home/')
  10. ……
  11. )
  12. )
  13. */
  14. class history {
  15. var $history_num;
  16. var $first;
  17. var $last;
  18. var $back;
  19. var $history=array();
  20. function __construct($ array=array(),$num=12){
  21. if (!$array) {//陣列為空.建構一個循環隊列。
  22. $history=array();
  23. for ($i=0; $i array_push($history,array('path'=>''));
  24. }
  25. $array=array(
  26. 'history_num'=>$num,
  27. 'first'=>0,//起始位置
  28. 'last'=>0,//終點位置
  29. 'back'=>0,
  30. 'history'=>$history
  31. );
  32. }
  33. $this->history_num=$array['history_num'];
  34. $this->first=$array['first'];
  35. $this->last=$array['last'];
  36. $this->back=$array['back'];
  37. $this->history=$array['history'];
  38. }
  39. function nextNum($i,$n=1){//環路下n一個值。和時鐘環路類似。
  40. return ($i+$n)history_num ? ($i+$n):($i+$n-$this->history_num);
  41. }
  42. function prevNum($i, $n=1){//環路上一個值i。回退N個位置。
  43. return ($i-$n)>=0 ? ($i-$n) : ($i-$n+$this->history_num);
  44. }
  45. function minus($ i,$j){//順時針兩點只差,i-j
  46. return ($i > $j) ? ($i - $j):($i-$j+$this->history_num);
  47. }
  48. function getHistory(){//回傳陣列,用來保存或序列化運算。
  49. return array(
  50. 'history_num'=> $this->history_num,
  51. 'first' => $this->first,
  52. 'last' => $this->last,
  53. 'back' => $this->back,
  54. 'history' => $this->history
  55. );
  56. }
  57. function add($path){
  58. if ($this->back!=0) {//有後退操作記錄的情況下,進行插入。
  59. $this->goedit($path);
  60. return;
  61. }
  62. if ($this->history[0]['path']=='') {//剛建構,不用加一.第一位不前移
  63. $this->history[$this->first]['path']=$path;
  64. return;
  65. }else{
  66. $this- >first=$this->nextNum($this->first);//首位前移
  67. $this->history[$this->first]['path']=$path;
  68. }
  69. if ($this->first==$this->last) {//起始位置與終止位置相遇
  70. $this->last=$this->nextNum($this->last);/ /末端位置前移。
  71. }
  72. }
  73. function goback(){//傳回first後退N步驟的位址。
  74. $this->back+=1;
  75. //最大後退步數為起點到終點之差(順時針之差)
  76. $mins=$this->minus($this->first, $this->last);
  77. if ($this->back >= $mins) {//退到最後點
  78. $this->back=$mins;
  79. }
  80. $pos=$this->prevNum($this->first,$this->back);
  81. return $this->history[$pos]['path'];
  82. }
  83. function gonext(){//從first後退N步的地方前進一步。
  84. $this->back-=1;
  85. if ($this->back $this->back=0;
  86. }
  87. return $this->history[$this->prevNum($this->first,$this->back)]['path'];
  88. }
  89. function goedit($path){//後退到某個點,沒有前進而是修改。則firs值為最後的值。
  90. $pos=$this->minus($this->first,$this->back);
  91. $pos=$this->nextNum($pos);//下一個
  92. $this ->history[$pos]['path']=$path;
  93. $this->first=$pos;
  94. $this->back=0;
  95. }
  96. / /是否可以後退
  97. function isback(){
  98. if ($this->back minus($this->first,$this->last)) {
  99. return ture;
  100. }
  101. return false;
  102. }
  103. //是否可以前進
  104. function isnext(){
  105. if ($this->back>0) {
  106. return true;
  107. }
  108. return false;
  109. }
  110. }
  111. //測試程式碼。
  112. $hi=new history(array(),6);//傳入空數組,則初始化數組構造。
  113. for ($i=0; $i $hi->add('s'.$i);
  114. }
  115. pr($hi->goback ());
  116. pr($hi->goback());
  117. pr($hi->goback());
  118. pr($hi->gonext());
  119. pr($hi->gonext());
  120. pr($hi->gonext());
  121. pr($hi->gonext());
  122. $hi->add( 'asdfasdf');
  123. $hi->add('asdfasdf2');
  124. pr($hi->getHistory());
  125. $ss=new history($hi ->getHistory());//直接用陣列建構。
  126. $ss->add('asdfasdf');
  127. $ss->goback();
  128. pr($ss->getHistory());
  129. ?>
複製程式碼
  1. /**
  2. * 取得變數的名字
  3. * eg hello="123" 取得ss字串
  4. */
  5. function get_var_name(&$aVar){
  6. foreach($GLOBALS as $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. if (is_array($var)){
  22. print_r($var);
  23. }
  24. else if(is_object($var)){
  25. echo get_class($var)." Object";
  26. }
  27. else if(is_resource($var)){
  28. echo (string)$var;
  29. }
  30. else{
  31. echo var_dump($var);
  32. }
  33. }
  34. $out = ob_get_clean();//緩衝輸出給$out 變數
  35. $out=preg_replace('/"(.*)"/','"'. '\1'.'"',$out);//高亮字串變數
  36. $out=preg_replace('/=>(.*)/','=>'.''.'\1'.'',$out);//高亮=>後面的值
  37. $out=preg_replace('/[(.*)] /','['.'\1'.'] ',$out);//高亮變數
  38. $from = array(' ','(',')','=>');
  39. $to = array(' ', '(',')','=>');
  40. $out=str_replace($from,$to,$out);
  41. $keywords=array('Array','int','string','class','object',' null');//關鍵字高亮
  42. $keywords_to=$keywords;
  43. foreach($keywords as $key=>$val)
  44. {
  45. $keywords_to[$key] = ''.$val.'
  46. ';
  47. }
  48. $out=str_replace($keywords,$keywords_to,$out);
  49. echo $style.''.get_var_name($var).' = '.$out.'';
  50. if ($exit) exit ;//為真則退出
  51. }
  52. /**
  53. * 偵錯輸出變數,物件的值。
  54. * 參數任一(任意型別的變數)
  55. * @return echo
  56. */
  57. function debug_out(){
  58. $avg_num = func_num_args();
  59. $avg_list= func__f ();
  60. ob_start();
  61. for($i=0; $i pr($avg_list[$i]);
  62. }
  63. $out=ob_get_clean();
  64. echo $out;
  65. exit;
  66. }
?>
複製程式碼🎜>?>
複製程式碼🎜>?>
複製程式碼🎜>?>

複製碼>
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板