自己手写一个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);
?>
效果如图:

自己手写一个queuelink的更多相关文章
- 『练手』手写一个独立Json算法 JsonHelper
背景: > 一直使用 Newtonsoft.Json.dll 也算挺稳定的. > 但这个框架也挺闹心的: > 1.影响编译失败:https://www.cnblogs.com/zih ...
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
- 【spring】-- 手写一个最简单的IOC框架
1.什么是springIOC IOC就是把每一个bean(实体类)与bean(实体了)之间的关系交给第三方容器进行管理. 如果我们手写一个最最简单的IOC,最终效果是怎样呢? xml配置: <b ...
- 放弃antd table,基于React手写一个虚拟滚动的表格
缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反 ...
- 只会用就out了,手写一个符合规范的Promise
Promise是什么 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Prom ...
- 搞定redis面试--Redis的过期策略?手写一个LRU?
1 面试题 Redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现? 2 考点分析 1)我往redis里写的数据怎么没了? 我们生产环境的redis怎么经常会丢掉一些数据?写进去了 ...
- 利用SpringBoot+Logback手写一个简单的链路追踪
目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...
- 手写一个简单的ElasticSearch SQL转换器(一)
一.前言 之前有个需求,是使ElasticSearch支持使用SQL进行简单查询,较新版本的ES已经支持该特性(不过貌似还是实验性质的?) ,而且git上也有elasticsearch-sql 插件, ...
- 看年薪50W的架构师如何手写一个SpringMVC框架
前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群. 本文介绍如何用eclipse一步一步搭建S ...
随机推荐
- jquery .stop()的用法
jquery的.stop()的用法: 目的:为了 了解stop()的用法,举个例子,直观的方式看看. 实物:一个id="animater"的div包含了一段文字.(以下用anima ...
- SqlBulkCopy 批量插入
ASP.NET批量插入的一种方式,直接上代码(方便以后查找): public static int ExcuteAddMany(string cmdStr, string[] tempArray, p ...
- Install latest git on CentOS 6/7
Assuming you have sudo/root permission. Try rpmforge-extras first. yum --disablerepo=base,updates -- ...
- SpringBoot 2.x 集成QQ邮箱、网易系邮箱、Gmail邮箱发送邮件
在Spring中提供了非常好用的 JavaMailSender接口实现邮件发送,在SpringBoot的Starter模块中也为此提供了自动化配置. 项目源码已托管在Gitee-SpringBoot_ ...
- 【JavaScript 插件】图片展示插件 PhotoSwipe 初识
前言: 考虑自己网站的图片展示,而且要支持移动端和PC端.自己写的代码也不尽如意,要写好的话也需要时间,于是就想到了使用相关插件. 准备: PhotoSwipe 官网地址:http://photosw ...
- 时间序列分析 异常分析 stl
https://blog.csdn.net/snowdroptulip/article/details/79125912 https://www.cnblogs.com/runner-ljt/p/52 ...
- Python操作redis系列之 列表(list) (五)(转)
# -*- coding: utf-8 -*- import redis r =redis.Redis(host=") 1. Lpush 命令将一个或多个值插入到列表头部. 如果 key 不 ...
- VS2015 ionic 开发环境配置纪要
1)第一次安装Tools for Apache Cordova不成功,到Options检查依赖项,缺少Node等,重新下载了32为的nodeJs安装.然后运行VS安装程序,卸载Tools for Ap ...
- 用于Spring Boot Jar部署的shell脚本
用于在Jenkins将jar发送到目标节点之后的部署操作, 包含deploy, start, stop, restart功能. 在deploy时会自动备份原jar至指定目录 # Please defi ...
- Docker入门 - 001 CentOS Docker 安装
Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS 仅发行版本中的内核支持 Docker. ...