自己手写一个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); ?>
效果如图:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
2017-03-29 THINKPHP5判断当前浏览器请求方式
2017-03-29 THINKPHP5操作数据库代码示例
2016-03-29 如何写一个简单的鼠标滑动过的二级菜单
2016-03-29 jquery获取节点的时候获取包含自己在内的HTML标签