ホームページ  >  記事  >  バックエンド開発  >  PHP は双方向の循環キューを実装します --- (履歴レコードの前方および後方などの機能を実装します)

PHP は双方向の循環キューを実装します --- (履歴レコードの前方および後方などの機能を実装します)

WBOY
WBOYオリジナル
2016-07-25 09:06:55929ブラウズ
操作履歴を記録する機能を実装するには


  1. 元に戻す機能とアンチアンドゥ機能に似た機能。 (前進・後退操作を実現)
  2. discuz フォーラムにログインして投稿を表示します (前後に移動して投稿を表示したり、投稿履歴を表示したりできます)
  3. ロジックは、Windows エクスプローラーのアドレス バーの前後の機能と同じです。


このニーズに基づいて、データ構造が実装されます。私は、一時的に歴史クラスと呼ばれる一般クラスを作成しました。
【原理は時計と似ています。オブジェクトをインスタンス化するときに、長さ N (長さは必要に応じて決定できます) ノードのリングを構築できます]
次に、さまざまな操作を統合します。前方、後方、挿入、変更挿入。

クラスは配列を構築できます。または、配列パラメータを渡してオブジェクトを構築します。 各操作の後、操作後の配列を取得できます。 手術後データは必要に応じて適切な方法で保存できます。 Cookie やセッションに入れたり、シリアライズしたり、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, // 最初の位置から何ステップ戻ったか、差分
  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. クラス履歴{
  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 < $num; $i++) {
  29. array_push($history,array('path'=>''));
  30. }
  31. $ array=array(
  32. 'history_num'=>$num,
  33. 'first'=>0,//開始位置
  34. 'last'=>0,//終了位置
  35. 'back'=>0,
  36. 'history'=>$history
  37. );
  38. }
  39. $this->history_num=$array['history_num'];
  40. $this->first=$array['first'];
  41. $this- > ;last=$array['last'];
  42. $this->back=$array['back'];
  43. $this->history=$array['history'];
  44. }
  45. 関数 nextNum (ループ内の $i,$n=1){//N 個の値。クロックループに似ています。
  46. return ($i+$n)<$this->history_num ? ($i+$n):($i+$n-$this->history_num);
  47. }
  48. function prevNum($i,$n= 1){// ループ上の最後の値 i。 N 位置に戻ります。
  49. return ($i-$n)>=0 ? ($i-$n) : ($i-$n+$this->history_num);
  50. }
  51. 関数マイナス($i,$j){ //時計回りの 2 つの点の唯一の違いは i-j
  52. return ($i > $j) ? ($i - $j):($i-$j+$this->history_num);
  53. }
  54. 関数getHistory (){//保存またはシリアル化操作に使用される配列を返します。
  55. return array(
  56. 'history_num'=> $this->history_num,
  57. 'first' => $this->first,
  58. 'last' => $this->last,
  59. 'back' => $this->back,
  60. 'history' => $this->history
  61. );
  62. }
  63. function add($path){
  64. if ($this->back!=0) {//バック操作レコードがある場合は、それを挿入します。
  65. $this->goedit($path);
  66. return;
  67. }
  68. if ($this->history[0]['path']=='') {//構築しただけなので、追加する必要はありません最初の位置 前進しません
  69. $this->history[$this->first]['path']=$path;
  70. return;
  71. }else{
  72. $this->first=$this-> nextNum($ this->first);//最初の位置を前に移動します
  73. $this->history[$this->first]['path']=$path
  74. }
  75. if ($this-> ;first==$ this->last) {//開始位置と終了位置が一致します
  76. $this->>last=$this->nextNum($this->last);//終了位置前進します。
  77. }
  78. }
  79. function goback(){//最初から N ステップ前のアドレスを返します。
  80. $this->back+=1;
  81. //戻るステップの最大数は、開始点と終了点の差 (時計回りの差) です
  82. $mins=$this->minus($this-> first,$this- >last);
  83. if ($this->back >= $mins) {//最後のポイントに戻る
  84. $this->back=$mins;
  85. }
  86. $pos =$this->prevNum($this->first,$this->back);
  87. return $this->history[$pos]['path'];
  88. }
  89. function gonext(){ // 最初から N に戻る 一歩前に進みます。
  90. $this->back-=1;
  91. if ($this->back $this->back=0;
  92. }
  93. return $this->> History [$this->prevNum($this->first,$this->back)]['path'];
  94. }
  95. function 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->gt;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 <8; $i++) {
  120. $hi->add('s'.$i)
  121. }
  122. pr($hi->goback());
  123. pr($hi->goback());
  124. pr($hi->goback());
  125. pr($hi->gonext());
  126. pr($hi->gonext() );
  127. pr($hi->gonext());
  128. pr($hi->gonext());
  129. $hi->add('asdfasdf');
  130. $hi->add(' asdfasdf2');
  131. pr($hi->getHistory());
  132. $ss=new History($hi->getHistory());//配列を使用して直接構築されます。
  133. $ss->add('asdfasdf');
  134. $ss->goback();
  135. pr($ss->getHistory());
  136. ?>
コードをコピー
  1. /**
  2. * 変数の名前を取得します
  3. * 例: 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. * @parammixed $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)." オブジェクト";
  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).'&lt ;/b> .$out.'
    ';
  48. if ($exit) exit;// true の場合終了
  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 までご連絡ください。