自己手写一个queuelink
代码如下:
<?php class QueueLink { private $first_key=0;//最前面的那个元素的键 private $first_value=0;//最前面的那个元素的值 private $last_key=0;//最后面的那个元素的键 private $last_value=0;//最后面的那个元素的值 private $index=0;//指定的指针 private $length=0;//队列长度 private $key_array=0;//队列键数组 private $value_array=0;//队列值数组 /** * QueueLink constructor. [构造方法] * @param array $list [要存储的数组列表] */ public function __construct($list=array()) { $length=count($list); if($length<1) { return false;//数量不够 } $this->length=$length;//存储队列长度 $this->key_array=array_keys($list);//存储键 $this->value_array=array_values($list);//存储值 $this->reset_first_last_key(); $this->reset_first_last_value(); } /** * 弹出第一个元素 * @return array [返回第一个元素的数组] */ public function out_left_first() { //弹出最左边一个 $first_key = array_shift($this->key_array);//弹出第一个key $first_value = array_shift($this->value_array);//弹出第一个值 $this->list_length_desc(1);//队列数量减少1个长度 $this->reset_key_value_list();//重置键值 return compact("first_key","first_value");//返回第一个元素的key和值 } /** * 弹出最后一个元素 * @return array [返回最后一个元素的数组] */ public function out_right_last() { //弹出最后边一个 $last_key = array_pop($this->key_array);//弹出第一个key $last_value = array_pop($this->value_array);//弹出第一个值 $this->list_length_desc(1);//队列数量减少1个长度 $this->reset_key_value_list();//重置键值 return compact("last_key","last_value");//返回最后一个元素的key和值 } /** * 返回第一个键 * @return int [返回第一个键] */ public function get_first_key() { return $this->first_key;//获取首个key } /** * 返回第一个值 * @return int [返回第一个值] */ public function get_first_value() { return $this->first_value;//获取首个值 } /** * 返回最后一个键 * @return int [返回最后一个键] */ public function get_last_key() { return $this->last_key;//获取最后一个key } /** * 返回最后一个值 * @return int [返回最后一个值] */ public function get_last_value() { return $this->last_value;//获取最后一个值 } /** * 重置键值列表 */ public function reset_key_value_list() { $this->reset_key_array();//重置键数组 $this->reset_value_array();//重置值数组 $this->reset_first_last_key();//重置第一个和最后一个键 $this->reset_first_last_value();//重置第一个和最后一个值 } /** * 重置第一个和最后一个key */ public function reset_first_last_key() { $this->first_value=isset($this->value_array[0])?$this->value_array[0]:null;//获取第一个 $this->last_value =isset($this->value_array[$this->length-1])?$this->value_array[$this->length-1]:null;//获取最后一个 } /** * 重置第一个和最后一个值 */ public function reset_first_last_value() { $this->first_key=isset($this->key_array[0])?$this->key_array[0]:null;//获取第一个 $this->last_key =isset($this->key_array[$this->length-1])?$this->key_array[$this->length-1]:null;//获取最后一个 } /** * 重置键数组 */ public function reset_key_array() { $this->key_array=array_values($this->key_array);//key重置 } /** * 重置值数组 */ public function reset_value_array() { $this->value_array=array_values($this->value_array);//value重置 } /** * 将队列的数据长度进行自增 * @param int $num [对自减做自增] */ public function list_length_add($num=1) { $this->length+=$num; } /** * 将队列的数据长度进行自减 * @param int $num [对自减做处理] */ public function list_length_desc($num=1) { $this->length-=$num; } /** * 从数组中根据key返回数据 * @param string $key [要获取的key] * @param bool $is_delete [是否要从队列中删除] * @return array|bool [返回找到的数组] */ public function get_data_by_key($key='',$is_delete=true) { //根据key得到数据 并且从数据队列中删除 $find_position=array_search($key,$this->key_array); if($find_position===false) { //说明不在数组中 立即返回 return false;//没有找到 } //如果在key列表中 $value=$this->value_array[$find_position]; if($is_delete) { //要删除这个元素 $this->remove_from_list_by_find_position($find_position);//从数组队列中移除这个key } return compact("key","value"); } /** * 根据找到的位置移除该元素 * @param int $find_position [查找到的位置] */ private function remove_from_list_by_find_position($find_position=0) { //移除元素 if($find_position==0) { //说明是第一个 $this->out_left_first();//第一个出队列 } elseif($find_position==$this->length-1) { //说明是最后一个 $this->out_right_last();//最后一个出队列 }else { //说明既不是开始 又不是结尾 从中间找到的 unset($this->key_array[$find_position]);//键数组去掉要找的元素 unset($this->value_array[$find_position]);//值数组去掉要找的元素 $this->list_length_desc(1);//队列数量减少1个长度 $this->reset_key_value_list();//重置键值 } } } $list=array( "id"=>"first", "name"=>"second", "pid"=>"third", "content"=>"fourth", "title"=>"fifth", ); $obj = new QueueLink($list);//实例化队列 //var_dump($obj); $first = $obj->out_left_first();//左边第一个 $last = $obj->out_right_last();//右边最后一个 //按照键取出某个数据 $key="pid"; $value=$obj->get_data_by_key($key,true); var_dump($first); var_dump($last); var_dump($value); var_dump($obj); ?>
效果如图: