自己手写一个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 ...
随机推荐
- ssm框架出现的常见问题
1:自己写的代码测试的时候显示用户过期,需要释放拦截器,并配置权限允许 2:Servlet.service() for servlet [springmvc] in context with path ...
- ftp修改上传后目录、文件权限问题 aix
问题:在AIX操作系统中,用root用户ftp文件到AIX上后,文件的默认权限是rw-r-----,Oracle用户无法读取.有没有办法指定上传文件的权限呢? 环境: AIX 6.1 解决方法: 1. ...
- Linux之磁盘分区篇
作业三: 1) 开启Linux系统前添加一块大小为20G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为10G,剩余空间给扩展分区,在扩展分区上 ...
- RequireJs 的 使用
为什么使用requirejs: 1.有效的防止命名的冲突 2.声明不同js之间的依赖 3.可以让我们的代码以模块化的方式组织 用法: 1.创建一个入口文件main.js(自己随便命名) 然后引入req ...
- C#实现无物理边距 可打印区域的绘图\打印 z
经常在开发实际的应用程序中,需要用到图形绘制和打印程序.如何实现完整的精确打印和绘图是需要注意许多细节地方的.最近在遇到打印问题的时候,仔细研究一阵,总结这篇博文,写得有点杂乱,看文要还请费点神. 基 ...
- 安装Harbor
一.安装Harbor 1. Harbor简介 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源Dock ...
- C# ExecutionContext 实现
网上关于ExecutionContext的说明比较少,我们来看看微软的描述吧, 名称 说明 Capture() 捕获从当前线程的执行上下文. CreateCopy() 创建当前执行上下文的副本. ...
- OUTLOOK - Unable to Delete Meetings
Error Information: Resolved: Check Meeting room permission.Get-MailboxFolderPermission MeetingRoom_1 ...
- redis 简单使用总结
作者:王清培(Plen wang) 沪江Java资深架构师 最近一段时间与redis接触比较频繁.发现有些东西还是工作中经常会用到的,自己也花了点时间巩固下.本篇文章主要是以总结性的方式梳理,因为r ...
- MATLAB 条形图添加多个图例
MATLAB 条形图添加多个图例: 1)只有一个图例: 2)两个图例: