本身手寫一個queuelink

代碼以下:php

<?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);
?>

效果如圖:數組

相關文章
相關標籤/搜索