偶然看到某些网站在新闻详情中 ,往往是需要根据当前信息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信息,找上一条信息,下一条信息(信息浏览的时候方便使用)的更多相关文章

  1. 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。

    有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...

  2. 13.mutiset树每一个结点都是一个链表的指针,可以存储相同的数据

    #include <iostream> //红黑树(自动保证平衡,自动生成平衡查找树) #include <set> #include <cstring> #inc ...

  3. 使用 Swift 制作一个新闻通知中心插件(1)

    input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...

  4. Swift 制作一个新闻通知中心插件1

    使用 Swift 制作一个新闻通知中心插件(1) 随着 iOS 8 的发布,苹果为开发者们开放了很多新的 API,而在这些开放的接口中 通知中心插件 无疑是最显眼的一个.通知中心就不用过多介绍了,相信 ...

  5. 用JS制作一个信息管理平台完整版

      前  言 JRedu 在之前的文章中,介绍了如何用JS制作一个实用的信息管理平台. 但是那样的平台功能过于简陋了,我们今天来继续完善一下. 首先我们回顾一下之前的内容.   1.JSON的基础知识 ...

  6. linux内核的双链表list_head、散列表hlist_head

    一.双链表list_head 1.基本概念 linux内核提供的标准链表可用于将任何类型的数据结构彼此链接起来. 不是数据内嵌到链表中,而是把链表内嵌到数据对象中. 即:加入链表的数据结构必须包含一个 ...

  7. 使用PyQt4制作一个正则表达式测试小工具

    最近在做一些网络爬虫的时候,会经常用到正则表达式.为了写出正确的正则表达式,我经常在这个网站上进行测试:Regex Tester.这个页面上面一个输入框输入正则表达式,下面一个输入框输入测试数据,上面 ...

  8. 制作一个可以滑动操作的 Table View Cell

    本文转载至 https://github.com/nixzhu/dev-blog Apple 通过 iOS 7 的邮件(Mail)应用介绍了一种新的用户界面方案——向左滑动以显示一个有着多个操作的菜单 ...

  9. Swift 中使用 SwiftyJSON 制作一个比特币价格 APP

    Swift 中处理 JSON 数据有很多种方式,可以使用原生的 NSJSONSerialization,也可以使用很多第三方库.原生的 NSJSONSerialization 方式这篇文章中介绍过.这 ...

随机推荐

  1. panel,dialog,window组件越界(超出范围)问题汇总

    参考地址 之前分别写过panel,dialog,window三个组件因为拖曳或者reSize造成组件越界而无法还原的问题,两篇文章分别针对拖曳和reSize给出了解决方案.不过根据朋友的反馈,reSi ...

  2. 如何通过numpy获得二维或多维数组的最大、小值索引

    虽然numpy数组中有argmax的函数可以获得数组的最大值的索引,但该函数获得的是numpy数组平铺后的索引,也就是一维索引.那么要怎样才能获得二维索引呢?实现很简单,比如我下面的代码: impor ...

  3. 用Jedis操作redis示例一,Key,value HashMap

    简单的key,value形式 public class RedisDemo { public static void main(String[] args) { Jedis jedis = new J ...

  4. (void)0和0的区别及用法

    (void)0相当于宏NULL,NULL本身的含义为“空”,在c语言代表“不存在.不确定”的含义. 0不能简单的理解为“没有”的意思,在c语言及二进制中,0和1代表的是“一件事物的正反两个方面“,0是 ...

  5. Linux:命令执行控制&&与||

    1.&& 方式:command1 && command2 如果command1执行成功,则执行command2 2.|| 方式:command1 || command2 ...

  6. 在linux平台下,设置core dump文件属性(位置,大小,文件名等)

    在linux平台下,设置core dump文件生成的方法: 1) 在终端中输入ulimit -c 如果结果为0,说明当程序崩溃时,系统并不能生成core dump. 2) 使用ulimit -c un ...

  7. MySql导入导出数据库(含远程导入导出)

    一.导入导出本地数据库    导出: 1.先运行cmd,cd 到mysql安装目录中的bin文件夹 2.mysqldump -u root -p 数据库名 > 导出文件名.sql 其他情况下: ...

  8. zend server 和zend studio 最佳实践

    1.zend server 安装好后需要重启下.无论是win还是mac..win不重启组件不能用.mac 不重启守护进程是离线的 2.修改apache配置.的根目录.到zendstudio的工作空间 ...

  9. iOS应用安全防护框架概述

    iOS应用安全防护框架概述 攻易防难,唯有缜密.多层的防护网络才能可靠的保护我们iOS应用程序的安全.那么,一个完善的iOS应用安全防护框架都要写哪些东西呢? 首先,先梳理一下常见的逆向及攻击工具. ...

  10. dp之01背包hdu2639(第k优解)

    http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值.......(注意,不要 和它的第一题混 ...