工作流的线性结构正好和数据结构的链表类似,于是就可以用链表来实现这个业务。
<?php function string_to_array($string,$delimiter=",") { if(is_string($string)) { $string=array_filter(explode($delimiter,$string)); } return $string; } function array_to_string($array=array(),$delimiter=",") { if(is_array($array)) { $array=implode($delimiter,$array); } return $array; } class MyQueue { private $total_array_list=array();//总的数组链表 private $progress_array_list=array();//已经完成的任务链表 private $current_index=0;//当前链表指针位置 private $prev_point=0;//指针上一位置 private $next_point=0;//指针下一位置 public function __construct($leader_list="",$checked_leader_list="") { $this->total_array_list=string_to_array($leader_list); $this->progress_array_list=string_to_array($checked_leader_list); $progress_length=count($this->progress_array_list);//当前完成进度 $this->current_index=$progress_length;//指针位置 $this->prev_point=isset($this->total_array_list[$this->current_index-1])?$this->total_array_list[$this->current_index-1]:null; $this->next_point=isset($this->total_array_list[$this->current_index])?$this->total_array_list[$this->current_index]:null; } /* * 队列链表指针向前移动 * **/ public function forward() { //链表向前移动 if(is_null($this->next_point)) { //到了最后一个任务了 不可继续向前 } else { $this->progress_array_list[]=$this->total_array_list[$this->current_index]; $this->current_index++; $this->prev_point=isset($this->total_array_list[$this->current_index-1])?$this->total_array_list[$this->current_index-1]:null; $this->next_point=isset($this->total_array_list[$this->current_index])?$this->total_array_list[$this->current_index]:null; } return $this; } /* * 队列链表指针向后移动 * **/ public function back_off() { //链表向后移动 if(is_null($this->prev_point)) { //到了第一个任务了 不可继续向后 } else { array_pop($this->progress_array_list); $this->current_index--; $this->prev_point=isset($this->total_array_list[$this->current_index-1])?$this->total_array_list[$this->current_index-1]:null; $this->next_point=isset($this->total_array_list[$this->current_index])?$this->total_array_list[$this->current_index]:null; } return $this; } /* * 拿到链表的信息 * **/ public function get_param() { $leader_list=array_to_string($this->total_array_list); $checked_leader_list=array_to_string($this->progress_array_list); $prev_leader=$this->prev_point; $next_leader=$this->next_point; return compact( "leader_list",//审核人列表 "checked_leader_list",//已经通过审核人的列表 "prev_leader",//上一审核人 "next_leader",//下一审核人 ); } }
我定义了两个方法来对字符串和数组进行转换和切割,封装代替了 implode explode
然后定义MyQueue 来作为链表操作的类。具体使用的方法如下:
<?php $obj=new MyQueue("1,2,3,4,5","1,2,3");//生成一个队列链表 $result=$obj->forward()->get_param();//指针向前移动 // $result=$obj->back_off()->get_param();//指针向后移动 var_dump($result); ?>
使用起来是很方便的。小小的骄傲一下,嘿嘿。