在web开发中,经常会有一个需求需要实现,那就是下一篇。比如,当我们阅读某一篇新闻时,一般在新闻详情页末尾会有,下一篇,标题是XXX。
然而在实现这个功能的时候,我虽然实现了,但是确实一种效率非常低的方法,幸好有经理帮我指出错误,并为我提供了解决方法。
话不多说,先附上我的烂代码:
//实现下一篇功能
$newslist = News::listNews('', 1, 99999999);
//---获取id数组
$newsidarr = array();
foreach ($newslist as $key => $value) {
$newsidarr[$key] = $value['id'];
}
//---获取下一篇id
$nextid = 0;
foreach ($newsidarr as $k => $v) {
if($id == $v){
if($k < (count($newsidarr)-1)){
$nextid = $newsidarr[$k + 1];
}
}
}
//---获取下一篇信息
if($nextid){
$nextinfo = News::getNews($nextid);
$next = '<a href="news_info.php?id='.$nextid.'">下一篇: '.$nextinfo["title"].'</a>';
}else{
$next = '<a href="javascript:;" style="background-color:#bbb;">已经是最后一篇了</a>';
}
这段代码虽然实现了功能,但是确实错误狠多。首先我在调用listNews方法的时候不应该用一串9来调取所有的新闻。因为还是存在多余这么多新闻的可能的。
第二个就是我的方法问题了。当我这样现获取所有的id做一个数组,然后跟当前id进行比对,获取下一篇新闻的id的方法是效率很低的,它不仅要去查一个表的所有数据获取id,还要把所有的id进行遍历再进行比对获取下一篇的id。当新闻很多的时候,这样的代码简直就是灾难。
优化方法:
因为新闻是按id排序的,所以我们可以写一个方法。将当前新闻id作为传入参数。然后select的时候查询比当前id大的id并加上limit 1,然后返回所查询到的id。这样便能完美的解决问题了。