自己手写一个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 ...
随机推荐
- Cocos Creator 节点
//节点从创建到节点挂载一些过程 1.JS中节点使用: a.创建:在properties中定义节点(可能包括节点的默认值和类型): b.挂载:在相应的方法中获取节点获取相应节点,挂载到父元素 例== ...
- HTML常用标签1
1 html html:超文本标记(标签)语言 通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 浏览器渲染的顺序:从上到下,从左到右 对于不同的浏览器,对同一标签可能会有不完全 ...
- 【贪心】[hdu1052]Tian Ji -- The Horse Racing(田忌赛马)[c++]
Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- JAVA自学作业02
JAVA自学作业02 1.什么是标识符?由哪些部分组成?常见的命名规则有哪些? 标识符是用户为变量的内存空间所定义的字符序列: 可以由字母.下划线.美元符号以及数字组成,但数字不可作为首字符.标识符不 ...
- 在图像上增加文字 C#
using (Image i = Image.FromFile(inputPath)) { using (Graphics g = Graphics.FromImage(i)) { g.DrawStr ...
- SharePoint PowerShell 启动工作流
前言 最近,有个需求,就是需要批量更新列表内容,平时这些操作,都用powershell去完成,但是,powershell需要在服务器上操作,而服务器权限需要通过客户的层层把关,所以,这次就考虑不用命令 ...
- Docker实现容器具有固定IP
Docker的网络类型 Docker安装后,默认会创建三种网络 $ docker network ls NETWORK ID NAME DRIVER SCOPE 6bdc00ad2a8d bridge ...
- 【Spring】bean动态注册到spring
/* * http://412887952-qq-com.iteye.com/blog/2348445 * http://www.jb51.net/article/106558.htm * https ...
- [Vuex] Lazy Load a Vuex Module at Runtime using TypeScript
Sometimes we need to create modules at runtime, for example depending on a condition. We could even ...
- git强制提交本地分支覆盖远程分支
git push origin 分支名 --force eg: cd 代码目录 git push origin master --force 运行结果: Total 0 (delta 0), reus ...