yii2实现队列及队列原理

来源:互联网 发布:华夏免费版数据库 编辑:程序博客网 时间:2024/05/24 05:34

本文实例讲述了yii2实现的双向队列类及其用法,对于PHP数据结构与算法的学习有不错的参考价值。分享给大家供大家参考。具体分析如下:

deque(全名 double-ended queue)是一种具有队列和栈的性质的数据结构。双向队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。进行删除操作的端称为队头,进行插入操作的端称为队尾。队列,是按照先进先出或后进后出的原则组织数据。当队列中没有元素时,称为空队列。

Deque.php类文件代码如下:

<?php/** *  队列 - 缓存 */namespace backend\models;use yii;use yii\base\Model;class Deque extends Model{    /**     * 队列内部数组     * @var array     */    public $queueArr = array();    /**     * 缓存名称     * @var string     */    public $cacheName;    /**     * 初始化类     * @var string     * @param array $cacheName     */    function __construct($cacheName = NULL)    {        $this->cacheName = $cacheName;        if(!empty($this->cacheName)){            if(!\Yii::$app->cache->exists($this->cacheName))                \Yii::$app->cache->add($this->cacheName, $this->queueArr);            $this->queueArr = \Yii::$app->cache->get($this->cacheName);        }else{            return false;        }    }    /**     * 重新载入     * @return array     */    public function reloadCache()    {        if(\Yii::$app->cache->exists($this->cacheName))            $this->queueArr = \Yii::$app->cache->get($this->cacheName);        else $this->queueArr = array();    }    /**     * 入队[尾部]     * @param array $value      */    public function addLast($value)    {        $this->reloadCache();        array_push($this->queueArr, $value);        \Yii::$app->cache->set($this->cacheName, $this->queueArr);        return \Yii::$app->cache->get($this->cacheName);    }    /**     * 出队[尾部]     * @return array     */    public function removeLast()    {        $this->reloadCache();        array_pop($this->queueArr);        \Yii::$app->cache->set($this->cacheName, $this->queueArr);        return \Yii::$app->cache->get($this->cacheName);    }    /**     * 入队[头部]     * @param array $value     */    public function addFirst($value)    {        $this->reloadCache();        array_unshift($this->queueArr, $value);        \Yii::$app->cache->set($this->cacheName, $this->queueArr);        return \Yii::$app->cache->get($this->cacheName);    }    /**     * 出队[头部]     * @return array     */    public function removeFirst()    {        $this->reloadCache();        array_shift($this->queueArr);        \Yii::$app->cache->set($this->cacheName, $this->queueArr);        return \Yii::$app->cache->get($this->cacheName);    }    /**     * 清空队列     */    public function empty()    {        $this->queueArr = array();        \Yii::$app->cache->delete($this->cacheName);    }    /**     * 获取数量     * @return int     */    public function getLength()    {        $this->reloadCache();        return count($this->queueArr);    }    /**     * 获取列头     * @return array     */    public function getFirst()    {        $this->reloadCache();        return reset($this->queueArr);    }    /**     * 获取列尾     * @return array     */    public function getLast()    {        $this->reloadCache();        return end($this->queueArr);    }}

简单使用示例:

use backend\models\Deque;$deque = new Deque('deque_cache_example');do{    // 获取队列头部数据    $data = $deque->getFirst();    if(!empty($data)){        //销毁原列队头部数据        $deque->removeFirst();    }}while($count = $deque->getLength());
原创粉丝点击