自己手写一个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 ...
随机推荐
- Aizu2224 Save your cats(最大生成树)
https://vjudge.net/problem/Aizu-2224 场景嵌入得很好,如果不是再最小生成树专题里,我可能就想不到解法了. 对所有的边(栅栏)求最大生成树,剩下来的长度即解(也就是需 ...
- 360se打开慢,lsass 过高 , cpu温度上升
rd /s /q "%AppData%\Roaming\Microsoft\Protect" rem C:\Users\Administrator\AppData\Roaming\ ...
- Python3 与 C# 网络编程之~ 网络基础篇
最新版本查看:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入门篇 官方文档:https://docs.python.org/3/library ...
- 用分离、附加的方式实现sql server数据库的备份和还原
一.数据库分离.附加的说明 SQL Server提供了"分离/附加"数据库."备份/还原"数据库.复制数据库等多种数据库的备份和恢复方法.这里介绍一种学习中常用 ...
- 理解ThreadPoolExecutor线程池的corePoolSize、maximumPoolSize和poolSize
我们知道,受限于硬件.内存和性能,我们不可能无限制的创建任意数量的线程,因为每一台机器允许的最大线程是一个有界值.也就是说ThreadPoolExecutor管理的线程数量是有界的.线程池就是用这些有 ...
- 【PMP】项目整合管理
项目整合的七个过程组: 制定项目章程 制定项目管理计划 指导语管理项目工作 管理项目知识 监控项目工作 实施整体变更控制 结束项目或阶段 1.制定项目章程 1.1 定义 制定项目章程是编写一份正式批准 ...
- Ubuntu 16.04 升级git
To update git on Ubuntu 12.04 just follow this line of commands: sudo apt-get install python-softwar ...
- geos 3.6.3库windows版本 已编译完成的32位版本和64位版本
网上教编译方法的很多,直接分享编译完成的很少. 我就把编译完成的分享出来吧. geos-3.6.3.tar.bz2 (Changes) 版本的 https://trac.osgeo.org/geos ...
- 12C - PDB archive file
在unplug一个pdb的时候,如果将扩展名定义为.pdb,oracle就会创建一个.pdb归档文件.包含pdb数据文件和xml元数据文件的压缩文件.创建archive file之后,就不用分开拷贝数 ...
- Spring Boot系列——AOP配自定义注解的最佳实践
AOP(Aspect Oriented Programming),即面向切面编程,是Spring框架的大杀器之一. 首先,我声明下,我不是来系统介绍什么是AOP,更不是照本宣科讲解什么是连接点.切面. ...