操作履歴を記録する機能を実装するには
- 元に戻す機能とアンチアンドゥ機能に似た機能。 (前進・後退操作を実現)
- discuz フォーラムにログインして投稿を表示します (前後に移動して投稿を表示したり、投稿履歴を表示したりできます)
- ロジックは、Windows エクスプローラーのアドレス バーの前後の機能と同じです。
このニーズに基づいて、データ構造が実装されます。私は、一時的に歴史クラスと呼ばれる一般クラスを作成しました。
【原理は時計と似ています。オブジェクトをインスタンス化するときに、長さ N (長さは必要に応じて決定できます) ノードのリングを構築できます]
次に、さまざまな操作を統合します。前方、後方、挿入、変更挿入。
クラスは配列を構築できます。または、配列パラメータを渡してオブジェクトを構築します。
各操作の後、操作後の配列を取得できます。
手術後データは必要に応じて適切な方法で保存できます。 Cookie やセッションに入れたり、シリアライズしたり、json データに変換してデータベースに保存したり、ファイルに入れたりします。 次回の使用に便利です。 拡張を容易にするために、より多くのデータを保存します。具体的には、各データは配列レコードでもあります。
たとえば、必要に応じて展開します: array('path'=>'D:/www/','sss'=>value)
-------------------------------------------- --- ----------------------------------
ちなみに、私が書いたデバッグ変数用のファイルを載せておきます。
- pr() は出力変数をフォーマットして強調表示できます。 pr($arr),pr($arr,1) は出力後に終了します。
- debug_out() は複数の変数を出力するために使用されます。デフォルトでは終了します。
- debug_out($_GET,$_SERVER,$_POST,$arr) ;
- include 'debug.php';
- /**
- * 履歴操作クラス
- * 配列を渡すか、配列を構築します。形式:
- array(
- 'history_num'=>20, //キューノードの総数
- 'first'=>0, //0から始まる開始位置。配列インデックス値
- 'last'=> ;0, // 0 から始まる終了位置。
- 'back'=>0, // 最初の位置から何ステップ戻ったか、差分
- 'history'=>array( // を格納する配列。操作キュー .
- array('path'=>'D:/'),
- array('path'=>'D:/www/'),
- array('path'=>'E:/ ') ,
- array('path'=>'/home/')
- ……
- )
- )
- */
-
- クラス履歴{
- var $history_num;
- var $first;
- var $last;
- var $ back;
- var $history=array();
-
- function __construct($array=array(),$num=12){
- if (!$array) {//配列は空です。
- $history=array();
- for ($i=0; $i < $num; $i++) {
- array_push($history,array('path'=>''));
- }
- $ array=array(
- 'history_num'=>$num,
- 'first'=>0,//開始位置
- 'last'=>0,//終了位置
- 'back'=>0,
- 'history'=>$history
- );
- }
- $this->history_num=$array['history_num'];
- $this->first=$array['first'];
- $this- > ;last=$array['last'];
- $this->back=$array['back'];
- $this->history=$array['history'];
- }
-
- 関数 nextNum (ループ内の $i,$n=1){//N 個の値。クロックループに似ています。
- return ($i+$n)<$this->history_num ? ($i+$n):($i+$n-$this->history_num);
- }
- function prevNum($i,$n= 1){// ループ上の最後の値 i。 N 位置に戻ります。
- return ($i-$n)>=0 ? ($i-$n) : ($i-$n+$this->history_num);
- }
-
- 関数マイナス($i,$j){ //時計回りの 2 つの点の唯一の違いは i-j
- return ($i > $j) ? ($i - $j):($i-$j+$this->history_num);
- }
-
-
- 関数getHistory (){//保存またはシリアル化操作に使用される配列を返します。
- return array(
- 'history_num'=> $this->history_num,
- 'first' => $this->first,
- 'last' => $this->last,
- 'back' => $this->back,
- 'history' => $this->history
- );
- }
-
- function add($path){
- if ($this->back!=0) {//バック操作レコードがある場合は、それを挿入します。
- $this->goedit($path);
- return;
- }
- if ($this->history[0]['path']=='') {//構築しただけなので、追加する必要はありません最初の位置 前進しません
- $this->history[$this->first]['path']=$path;
- return;
- }else{
- $this->first=$this-> nextNum($ this->first);//最初の位置を前に移動します
- $this->history[$this->first]['path']=$path
- }
- if ($this-> ;first==$ this->last) {//開始位置と終了位置が一致します
- $this->>last=$this->nextNum($this->last);//終了位置前進します。
- }
- }
-
- function goback(){//最初から N ステップ前のアドレスを返します。
- $this->back+=1;
- //戻るステップの最大数は、開始点と終了点の差 (時計回りの差) です
- $mins=$this->minus($this-> first,$this- >last);
- if ($this->back >= $mins) {//最後のポイントに戻る
- $this->back=$mins;
- }
-
- $pos =$this->prevNum($this->first,$this->back);
- return $this->history[$pos]['path'];
- }
-
- function gonext(){ // 最初から N に戻る 一歩前に進みます。
- $this->back-=1;
- if ($this->back $this->back=0;
- }
- return $this->> History [$this->prevNum($this->first,$this->back)]['path'];
- }
- function goedit($path){//先に進めずに特定の時点に戻る改造ですよ。最初の値が最後の値です。
- $pos=$this->minus($this->first,$this->back);
- $pos=$this->nextNum($pos);//次
- $this-> ; History[$pos]['path']=$path;
- $this->first=$pos;
- $this->back=0;
- }
-
- //戻ってもいいですか
- function isback() {
- if ($this->back < $this->minus($this->gt;first,$this->last)) {
- return ture;
- }
- return false;
- }
- //前に進むことは可能ですか
- function isnext(){
- if ($this->back>0) {
- return true;
- }
- return false;
- }
- }
- //テストコード。
- $hi=new History(array(),6);//空の配列が渡されると、配列の構築が初期化されます。
- for ($i=0; $i <8; $i++) {
- $hi->add('s'.$i)
- }
- pr($hi->goback());
- pr($hi->goback());
- pr($hi->goback());
- pr($hi->gonext());
- pr($hi->gonext() );
- pr($hi->gonext());
- pr($hi->gonext());
- $hi->add('asdfasdf');
- $hi->add(' asdfasdf2');
- pr($hi->getHistory());
-
-
- $ss=new History($hi->getHistory());//配列を使用して直接構築されます。
- $ss->add('asdfasdf');
- $ss->goback();
- pr($ss->getHistory());
-
-
- ?>
コードをコピー
- /**
- * 変数の名前を取得します
- * 例: hello="123" ss 文字列を取得します
- */
- function get_var_name(&$aVar){
- foreach($GLOBALS as $key=>$var)
- {
- if($aVar== $GLOBALS[$key] && $key!="argc"){
- return $key;
- }
- }
- }
-
- /**
- * フォーマットされた出力変数、またはオブジェクト
- * @parammixed $var
- * @param boolean $exit
- */
- function pr($var,$exit = false){
- ob_start();
- $style='
- pre#debug{margin:10px;font-size:13px;color:#222;font-family:Consolas ;line-height:1.2em;background:# f6f6f6;border-left:5px Solid #444;padding:5px;width:95%;word-break:break-all;}
- pre#debug b{font-weight:400;}
- #debug #debug_str{color: #E75B22;}
- #debug #debug_keywords{font-weight:800;color:00f;}
- #debug #debug_tag1{color:#22f;}
- #debug #debug_tag2{color:#f33;font-weight:800; }
- #debug #debug_var{color:#33f;}
- #debug #debug_var_str{color:#f00;}
- #debug #debug_set{color:#0C9CAE;}';
- if (is_array($ var)){
- print_r($var);
- }
- else if(is_object($var)){
- echo get_class($var)." オブジェクト";
- }
- else if(is_resource($var)){
- echo (string)$var;
- }
- else{
- echo var_dump($var);
- }
- $out = ob_get_clean();//$out 変数に出力をバッファ
-
- $out=preg_replace('/"(. *)"/','"'.'\1'.'"',$out);//文字列変数をハイライト
- $out=preg_replace (' /=>(.*)/','=>'.''.'\1'.'',$out);/ /ハイライト=>次の値
- $out=preg_replace('/[(.*)]/','[ '.'\1'.']',$out);//変数を強調表示
-
- $from = array( ' ',' (',')','=>');
- $to = array(' ','(',')','=>');
- $out=str_replace($from,$to,$ out);
-
- $keywords=array('Array','int','string','class','object','null');//キーワードの強調表示
- $keywords_to=$keywords;
- foreach ($keywords as $key =>$val)
- {
- $keywords_to[$key] = ''.$val.'';
- }
- $ out=str_replace($keywords ,$keywords_to,$out);
- echo $style.'
<b id="debug_keywords">'.get_var_name($var).'< ;/b> .$out.' ';
- if ($exit) exit;// true の場合終了
- }
-
- /**
- * 出力変数、オブジェクト値をデバッグします。
- * 任意の数のパラメータ (任意の型の変数)
- * @return echo
- */
- function debug_out(){
- $avg_num = func_num_args() ;
- $avg_list= func_get_args();
- ob_start();
- for($i=0; $i pr($avg_list[$i]) ;
- }
- $out= ob_get_clean();
- echo $out;
- exit;
- }
-
-
- ?>
-
コードをコピー
|