代码如下:

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

效果如图:

自己手写一个queuelink的更多相关文章

  1. 『练手』手写一个独立Json算法 JsonHelper

    背景: > 一直使用 Newtonsoft.Json.dll 也算挺稳定的. > 但这个框架也挺闹心的: > 1.影响编译失败:https://www.cnblogs.com/zih ...

  2. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  3. 【spring】-- 手写一个最简单的IOC框架

    1.什么是springIOC IOC就是把每一个bean(实体类)与bean(实体了)之间的关系交给第三方容器进行管理. 如果我们手写一个最最简单的IOC,最终效果是怎样呢? xml配置: <b ...

  4. 放弃antd table,基于React手写一个虚拟滚动的表格

    缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反 ...

  5. 只会用就out了,手写一个符合规范的Promise

    Promise是什么 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Prom ...

  6. 搞定redis面试--Redis的过期策略?手写一个LRU?

    1 面试题 Redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现? 2 考点分析 1)我往redis里写的数据怎么没了? 我们生产环境的redis怎么经常会丢掉一些数据?写进去了 ...

  7. 利用SpringBoot+Logback手写一个简单的链路追踪

    目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...

  8. 手写一个简单的ElasticSearch SQL转换器(一)

    一.前言 之前有个需求,是使ElasticSearch支持使用SQL进行简单查询,较新版本的ES已经支持该特性(不过貌似还是实验性质的?) ,而且git上也有elasticsearch-sql 插件, ...

  9. 看年薪50W的架构师如何手写一个SpringMVC框架

    前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群. 本文介绍如何用eclipse一步一步搭建S ...

随机推荐

  1. HTML常用标签1

    1 html html:超文本标记(标签)语言 通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 浏览器渲染的顺序:从上到下,从左到右 对于不同的浏览器,对同一标签可能会有不完全 ...

  2. JSAP101

    JSAP101 1.DOM 1)文档对象模型 文档:把一个Html文件看成一个文档,所以把这个文档看成一个对象.XML文件也可以看成一个文件.XML侧重于存储数据,html主要以展示为主.一个页面就是 ...

  3. CentOS 7创建自定义KVM模板(现有KVM迁移到另外一台机)

    说明:创建KVM模板有个好处,不用每次都运行命令创建,并且可以为迁移做准备. 一.创建KVM模板 1.下载iso(省略) 2.创建磁盘 qemu-img create -f raw centos7.r ...

  4. Deep Learning.ai学习笔记_第一门课_神经网络和深度学习

    目录 前言 第一周(深度学习引言) 第二周(神经网络的编程基础) 第三周(浅层神经网络) 第四周(深层神经网络) 前言 目标: 掌握神经网络的基本概念, 学习如何建立神经网络(包含一个深度神经网络), ...

  5. 每天一个linux命令(7):mv

    1.命令简介 mv(Move file)将源文件重命名为目标文件,或将源文件移动至指定目录.. 2.用法 mv [选项]... [-T] 源文件 目标文件 或:mv [选项]... 源文件... 目录 ...

  6. 1154:LETTERS

    题目链接http://bailian.openjudge.cn/practice/1154/ 总时间限制: 1000ms 内存限制: 65536kB 描述 A single-player game i ...

  7. Rabbit五种消息队列学习(二) – 简单队列

    队列结构图 P:消息的生产者 C:消息的消费者 红色:队列 生产者将消息发送到队列,消费者从队列中获取消息. 测试 1.连接MQ public static Connection getConnect ...

  8. Python之Simple FTP (一)

    一.引言: 好久之前想写一个ftpserver的小daemon,但是一直拖着就没有写,这回正好处于放假的时候可以有时间来写写. 二.FTP需求功能: 1.用户认证系统 2.文件上传和下载功能 a.支持 ...

  9. H+ 编辑tab页 保存后 刷新列表tab页 并关闭自已。tabA页调用tabB页的方法

    //注:在contabs.js文件中 $(function () { }); 方法外 加入 //注: data-name="' + menuName + '" 这句是加入的自定义属 ...

  10. [转]Docker中的镜像

    引言 这篇文章中我们主要来探讨下Docker镜像,它是用来启动容器的构建基石,本文的所用到的Dcoker版本是17.1,API版本是1.33,Go的版本是1.9.2,OS是基于Arch Linux的M ...