自己制作一个链表用来存储列表信息,并查找当前id信息,找上一条信息,下一条信息(信息浏览的时候方便使用)
偶然看到某些网站在新闻详情中 ,往往是需要根据当前信息id获取到上一条信息和下一条信息的,而通常我们的做法是先获取当前信息,再获取上一条信息,再获取下一条信息,就需要发送三次查询才能够得到这些信息,一些编程网站或者论坛给出的方案是用SQL union写的。
比如当前id为5 想获取当前信息 上一条信息 下一条信息就是
- (select * from news where id <5 order by id desc limit 1)
- union
- (select * from news where id=5 )
- union
- (select * from news where id >5 order by id asc limit 1)
结果如图
而如果这样写觉得不太好的话也可以写成这样
- select * from news where id in (
- select id from (
- (select id from news where id >5 order by id asc limit 1)
- union
- (select 5 as id)
- union
- (select id from news where id <5 order by id desc limit 1)
- ) as tmp
- ) order by id asc;
结果如图
总之脱离不了用数据库进行union查询,这里我提供用程序的解决方案,就是在数据量不是很多的情况下,把所有列表信息查询出来后放入缓存,然后组成一个链表。链表的定义和使用如下:
- <?php
- class Chain
- {
- private $chain_list=array();//链表以索引为key的总数组
- private $key_list=array();//key的集合数组
- private $current_index=0;//当前查找到的那个索引位置
- function __construct($array=array(),$index="id")
- {
- foreach($array as $value)
- {
- $key=isset($value[$index])?$value[$index]:die("链表结构没有设定索引");
- $this->chain_list[$key]=$value;
- $this->key_list[]=$key;
- }
- }
- public function find($index="")
- {
- if($index===""){return false;}
- if(isset($this->chain_list[$index]))
- {
- $this->current_index=array_search($index,$this->key_list);//找到你想要的那个索引对应的位置
- }
- return isset($this->chain_list[$index])?$this->chain_list[$index]:false;
- }
- public function prev()
- {
- //上一位
- if($this->current_index==0)
- {
- //说明现在你选择的是第一个 第一个没有上一位
- return false;
- }else
- {
- $find_key=$this->current_index-1;//索引前面的那位
- $key=$this->key_list[$find_key];//寻找总数组中的索引
- return isset($this->chain_list[$key])?$this->chain_list[$key]:false;
- }
- }
- public function next()
- {
- //下一位
- if($this->current_index==count($this->chain_list)-1)
- {
- //说明现在你选择的是最后一个 最后一个没有下一位
- return false;
- }else
- {
- $find_key=$this->current_index+1;//索引前面的那位
- $key=$this->key_list[$find_key];//寻找总数组中的索引
- return isset($this->chain_list[$key])?$this->chain_list[$key]:false;
- }
- }
- }
- $list=array(
- array("id"=>1,"title"=>"第1条新闻","desc"=>"第1条新闻描述"),
- array("id"=>2,"title"=>"第2条新闻","desc"=>"第2条新闻描述"),
- array("id"=>3,"title"=>"第3条新闻","desc"=>"第3条新闻描述"),
- array("id"=>4,"title"=>"第4条新闻","desc"=>"第4条新闻描述"),
- array("id"=>5,"title"=>"第5条新闻","desc"=>"第5条新闻描述"),
- array("id"=>6,"title"=>"第6条新闻","desc"=>"第6条新闻描述"),
- );
- $chain=new Chain($list,"id");
- $id=5;
- $now=$chain->find($id);//找到当前的那条
- $prev=$chain->prev($id);//找到前一条
- $next=$chain->next($id);//找到后一条
- var_dump($prev);//打印当前的那条
- var_dump($now);//打印前一条
- var_dump($next);//打印后一条
- var_dump($chain);//打印链表
- ?>
结果如图
自己制作一个链表用来存储列表信息,并查找当前id信息,找上一条信息,下一条信息(信息浏览的时候方便使用)的更多相关文章
- 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。
有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...
- 13.mutiset树每一个结点都是一个链表的指针,可以存储相同的数据
#include <iostream> //红黑树(自动保证平衡,自动生成平衡查找树) #include <set> #include <cstring> #inc ...
- 使用 Swift 制作一个新闻通知中心插件(1)
input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...
- Swift 制作一个新闻通知中心插件1
使用 Swift 制作一个新闻通知中心插件(1) 随着 iOS 8 的发布,苹果为开发者们开放了很多新的 API,而在这些开放的接口中 通知中心插件 无疑是最显眼的一个.通知中心就不用过多介绍了,相信 ...
- 用JS制作一个信息管理平台完整版
前 言 JRedu 在之前的文章中,介绍了如何用JS制作一个实用的信息管理平台. 但是那样的平台功能过于简陋了,我们今天来继续完善一下. 首先我们回顾一下之前的内容. 1.JSON的基础知识 ...
- linux内核的双链表list_head、散列表hlist_head
一.双链表list_head 1.基本概念 linux内核提供的标准链表可用于将任何类型的数据结构彼此链接起来. 不是数据内嵌到链表中,而是把链表内嵌到数据对象中. 即:加入链表的数据结构必须包含一个 ...
- 使用PyQt4制作一个正则表达式测试小工具
最近在做一些网络爬虫的时候,会经常用到正则表达式.为了写出正确的正则表达式,我经常在这个网站上进行测试:Regex Tester.这个页面上面一个输入框输入正则表达式,下面一个输入框输入测试数据,上面 ...
- 制作一个可以滑动操作的 Table View Cell
本文转载至 https://github.com/nixzhu/dev-blog Apple 通过 iOS 7 的邮件(Mail)应用介绍了一种新的用户界面方案——向左滑动以显示一个有着多个操作的菜单 ...
- Swift 中使用 SwiftyJSON 制作一个比特币价格 APP
Swift 中处理 JSON 数据有很多种方式,可以使用原生的 NSJSONSerialization,也可以使用很多第三方库.原生的 NSJSONSerialization 方式这篇文章中介绍过.这 ...
随机推荐
- 如何让iOS模拟器也能测试蓝牙4.0程序?
买一个CSR蓝牙4.0 USB适配器,插在Mac上 在终端输入sudo nvram bluetoothHostControllerSwitchBehavior="never" 重启 ...
- python --对象的属性
转自:http://www.cnblogs.com/vamei/archive/2012/12/11/2772448.html Python一切皆对象(object),每个对象都可能有多个属性(att ...
- export、exports、modules.exports 和 require 、import 的一些组合套路和坑
推荐阅读第三方文章: http://www.tuicool.com/articles/uuUVBv2 引入: require / import 导出:export / module.exports / ...
- centos-7 charpter one
一.system locale 的介绍: 系统的区域设置被保存在/etc/locale.conf 这个文件中,systemd在启动的时候会去读取它:所有用户和程序的区域设置都继承自它, 当然用户&am ...
- unity, 忽略碰撞
一,layer之间忽略碰撞. Edit->Project Settings->Physics->Layer Collision Matrix 二,collider之间忽略碰撞. vo ...
- jquery常见插件用法表
一:美化select表单:chosen.jquery.js http://harvesthq.github.io/chosen/ 关于ajax更新列表后需要触发下插件的事件,才会表现出来:(http: ...
- Huffman的应用之文件压缩与解压缩
文件压缩与解压缩> 近期这段时间一直在学习树的这样的数据结构,也接触到了Huffman树以及了解了什仫是Huffman编码,而我们经常使用的zip压缩也是利用的Huffman编码的特性 ...
- spring 学习资料备份
易百教程 https://www.yiibai.com/spring/spring-autowiring-by-name.html
- Java Mail(一):telnet实现发送收取邮件
http://blog.csdn.net/ghsau/article/details/8602076 ******************************* 最近要做一个解析邮件的东东,就顺便 ...
- python 快速获取文件类型