首页 后端开发 php教程 php实现双向循环队列--- (实现历史记录的前进后退等功能)

php实现双向循环队列--- (实现历史记录的前进后退等功能)

Jul 25, 2016 am 09:06 AM

为实现一个记录操作历史的功能


  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开始。
  9. 'back'=>0, //从first位置倒退了多少步,差值。
  10. 'history'=>array( //数组,存放操作队列。
  11. array('path'=>'D:/'),
  12. array('path'=>'D:/www/'),
  13. array('path'=>'E:/'),
  14. array('path'=>'/home/')
  15. ……
  16. )
  17. )
  18. */
  19. class history{
  20. var $history_num;
  21. var $first;
  22. var $last;
  23. var $back;
  24. var $history=array();
  25. function __construct($array=array(),$num=12){
  26. if (!$array) {//数组为空.构造一个循环队列。
  27. $history=array();
  28. for ($i=0; $i 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->back=$array['back'];
  42. $this->history=$array['history'];
  43. }
  44. function nextNum($i,$n=1){//环路下n一个值。和时钟环路类似。
  45. return ($i+$n)history_num ? ($i+$n):($i+$n-$this->history_num);
  46. }
  47. function prevNum($i,$n=1){//环路上一个值i。回退N个位置。
  48. return ($i-$n)>=0 ? ($i-$n) : ($i-$n+$this->history_num);
  49. }
  50. function minus($i,$j){//顺时针两点只差,i-j
  51. return ($i > $j) ? ($i - $j):($i-$j+$this->history_num);
  52. }
  53. function getHistory(){//返回数组,用于保存或者序列化操作。
  54. return array(
  55. 'history_num'=> $this->history_num,
  56. 'first' => $this->first,
  57. 'last' => $this->last,
  58. 'back' => $this->back,
  59. 'history' => $this->history
  60. );
  61. }
  62. function add($path){
  63. if ($this->back!=0) {//有后退操作记录的情况下,进行插入。
  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(){//返回从first后退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(){//从first后退N步的地方前进一步。
  89. $this->back-=1;
  90. if ($this->back $this->back=0;
  91. }
  92. return $this->history[$this->prevNum($this->first,$this->back)]['path'];
  93. }
  94. function goedit($path){//后退到某个点,没有前进而是修改。则firs值为最后的值。
  95. $pos=$this->minus($this->first,$this->back);
  96. $pos=$this->nextNum($pos);//下一个
  97. $this->history[$pos]['path']=$path;
  98. $this->first=$pos;
  99. $this->back=0;
  100. }
  101. //是否可以后退
  102. function isback(){
  103. if ($this->back minus($this->first,$this->last)) {
  104. return ture;
  105. }
  106. return false;
  107. }
  108. //是否可以前进
  109. function isnext(){
  110. if ($this->back>0) {
  111. return true;
  112. }
  113. return false;
  114. }
  115. }
  116. //测试代码。
  117. $hi=new history(array(),6);//传入空数组,则初始化数组构造。
  118. for ($i=0; $i $hi->add('s'.$i);
  119. }
  120. pr($hi->goback());
  121. pr($hi->goback());
  122. pr($hi->goback());
  123. pr($hi->gonext());
  124. pr($hi->gonext());
  125. pr($hi->gonext());
  126. pr($hi->gonext());
  127. $hi->add('asdfasdf');
  128. $hi->add('asdfasdf2');
  129. pr($hi->getHistory());
  130. $ss=new history($hi->getHistory());//直接用数组构造。
  131. $ss->add('asdfasdf');
  132. $ss->goback();
  133. pr($ss->getHistory());
  134. ?>
复制代码
  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. $out = ob_get_clean();//缓冲输出给$out 变量
  34. $out=preg_replace('/"(.*)"/','"'.'\\1'.'"',$out);//高亮字符串变量
  35. $out=preg_replace('/=\>(.*)/','=>'.''.'\\1'.'',$out);//高亮=>后面的值
  36. $out=preg_replace('/\[(.*)\]/','['.'\\1'.']',$out);//高亮变量
  37. $from = array(' ','(',')','=>');
  38. $to = array(' ','(',')','=>');
  39. $out=str_replace($from,$to,$out);
  40. $keywords=array('Array','int','string','class','object','null');//关键字高亮
  41. $keywords_to=$keywords;
  42. foreach($keywords as $key=>$val)
  43. {
  44. $keywords_to[$key] = ''.$val.'';
  45. }
  46. $out=str_replace($keywords,$keywords_to,$out);
  47. echo $style.'
    <b id="debug_keywords">'.get_var_name($var).'</b> = '.$out.'
    登录后复制
    ';
  48. if ($exit) exit;//为真则退出
  49. }
  50. /**
  51. * 调试输出变量,对象的值。
  52. * 参数任意个(任意类型的变量)
  53. * @return echo
  54. */
  55. function debug_out(){
  56. $avg_num = func_num_args();
  57. $avg_list= func_get_args();
  58. ob_start();
  59. for($i=0; $i pr($avg_list[$i]);
  60. }
  61. $out=ob_get_clean();
  62. echo $out;
  63. exit;
  64. }
  65. ?>
复制代码


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在Laravel中使用Flash会话数据 在Laravel中使用Flash会话数据 Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

php中的卷曲:如何在REST API中使用PHP卷曲扩展 php中的卷曲:如何在REST API中使用PHP卷曲扩展 Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了 简化的HTTP响应在Laravel测试中模拟了 Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12个最佳PHP聊天脚本 在Codecanyon上的12个最佳PHP聊天脚本 Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

解释PHP中晚期静态结合的概念。 解释PHP中晚期静态结合的概念。 Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

框架安全功能:防止漏洞。 框架安全功能:防止漏洞。 Mar 28, 2025 pm 05:11 PM

文章讨论了框架中的基本安全功能,以防止漏洞,包括输入验证,身份验证和常规更新。

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

See all articles