自己手写一个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);
?>

效果如图:

原文地址:https://www.cnblogs.com/lizhaoyao/p/10620338.html