王志勇 发表于 2010年04月05日 17:56
昨天重新写了一个新的分页程序,类似于这样的存档功能:http://www.ufoaq.com/archives/201003/。这个分页程序比较复杂,是打开2组数据库,大约是在2006年完成的ASP程序,后来移植到PHP程序。因为当时写程序的时候,没有记笔记,算法已经记不清了。后来重新写了这个程序大约2次,每次都需要2~4天,都没有成功,失败了,运行的结果总是不正确。这次重新编写成功了,并记录了笔记。因为这个分页的算法太重要了,我需要熟练地掌握它,并且理解它,希望让它有更简单的算法,我以前写的论坛程序www.ufoaq.com、留言板程序http://www.ufoaq.com/cast/wish/,都是使用这样的分页算法,所以才可以支持很大的容量。 因为当时没有写工作日志,算法已经完全忘记了。直接看程序,无法看出当时打草稿时的数字规律,无法看懂。所以很多程序都直接使用大约2006年推算的算法,经过很多的测试,从未出错。http://www.ufoaq.com/archives/201003/的程序是每页300条记录,分为2纵列。打开2组数据库,然后依次显示每条数据。当显示完第150条数据时,输出一个<li>元素使其分成第2列。现在这个程序重新写,2组数据库提取时,让其合并为1组就方便多了。2组数据库,或者多组数据库合并为1组的好处是后续的操作简便,可以实现更多的功能。例如让其第1页显示100条记录,从第2页开始每页显示300条记录;15条记录×2列为1个区域,即30条记录/区域,每页10个区域,即每页300条,以分区域的方式显示。 我写的博客程序www.auiou.com和www.zj7.com的分页程序的算法相对比上述简单很多,如首页之后的第2页、第3页的分页程序,分类和按月存档的的分页程序,都是相同的算法,如这里http://www.auiou.com/relevant/00000445.jsp,这个算法任何语言都可以通用。但还可以再简化,例如PHP可以直接用$p=ceil($auf/$w3);一个语句就可以获得总共的页数。所以这个博客的分页程序可以简化为: <?//$pa为页数 因为打开多组数据库的分页比较复杂,这2天总是出现很多的错误。每一次程序很乱的时候,就把相应的大片的程序删除,再重新写,反复写了3次。今天调试的时候,发现昨天写的程序中有四、五处错误,逐个排查之后,经过很多测试,程序运行正常。 这2天运算的一些过程: 23 4: 说明:上面的23 4,表示:23是总共有23条数据,4为每页显示4条记录;其中,每组数据库有10条记录,下述用变量$i3表示。下面的数据与上述的格式相同,因为篇幅的关系,不再打表格,因为我在用数字做演算测试的时候,也没有像上面一样打表格,而是直接用下面的方式来记录: 23 5 23 6 30 6 33 6 $e4的值表示提取最近一组数据的数据条数: 通过上述很多数据的反复对比,如23 4这些数据,其规律10=13-3,4=17-13,8=21-13,其中等号左边的值如10、4、8,是2组数据库时提取第1组数据库时的$w1,等号右边的被减数13、17、21,是2组数据库时的$w1,等号右边的减数3、13、13,是我需要重点推算出来的值,这个值很容易出错,假设这个值的变量是$e5。$e5的意义是,在当前的页面中,$e5表示之前显示过多少条数据。最终经过直接观察数字的规律而直接写公式,我并不明白这是为什么,但是根据数字的规律用这个推算出来的公式,就不会出错了。规律如下: 同样的格式: 2 0 如果将$n1显示为未乘以$i3前的值,如下: 3 0 4 0 通过上述的规律,最终,$e5的值可以准确地获得了,如下: <$i=$e1+1; 变量$a5表示如上述提到的第1页特定显示的条目数如100条记录,$w5和$w6是最终要获得的2组数据库合并后的起始和结束值,$w5是起始值,$w6是结束值;相当于这页程序http://www.auiou.com/relevant/00000445.jsp的$w1和$w2。为了不造成混淆,必须使用2个不同的变量,因为当$a5存在时,$w5和$w1的值不同。$w5和$w6的获得方法: <$w5=$w1;$w6=$w2; 通过对各个部分的反复思考和测试,最终大功告成了。很多程序,以及程序中的变量代表的含义,经常是没有唯一的意义,或者方法,或者思维方法,一会儿这样,一会儿那样;一会儿代表这个含义,一会儿代表那个含义。但最终还是能通过使用不同的方法,实现想要实现的功能、解决问题,殊途同归,有些类似于代数、几何的证明题用不同的方法证明同一个命题。
$w3=10;
$p=ceil($auf/$w3);
if (!$p) $p=1;
$w1=($pa-1)*$w3+1;
$w2=$pa*$w3;
if ($w2>$auf) $w2=$auf;?>第N页 数据组 1组数据库的情形 2组数据库的情形 规律 1 3 1-4 1-3 1-1 2 2 5-8 2-5 2=5-3 3 2 9-12 6-9 6=9-3 4 2 13-16 10-10 1-3 10=13-3 5 1 17-20 4-7 4=17-13 6 1 21-23 8-10 8=21-13
1 3 1-5 1-3 1-2
2 2 6-10 3-7 3=6-3
3 2 11-15 8-10 1-2 8=11-3
4 1 16-20 3-7 3=16-13
5 1 21-23 8-10 8=21-13
1 3 1-6 1-3 1-3
2 2 7-12 4-9 4=7-3
3 2 13-18 10-10 1-5 10=13-3
4 1 19-23 6-10 6=19-13
1 3 1-6 1-6
2 3 7-12 7-10 1-2
3 2 13-18 3-8 3=13-10
4 1 19-24 9-10 1-4 9=19-10
5 1 25-30 5-10 5=25-20
1 4 1-6 1-3 1-3
2 3 7-12 4-9 4=7-3
3 3 13-18 10-10 1-5 10=13-3
4 2 19-24 6-10 1-1 6=19-13
5 1 25-30 2-7 2=25-23
6 1 31-33 8-10 8=31-23
<?$pb=ceil($e1/$i3);
$p=$pb;
$e4=$e1-($pb-1)*$i3;?>数据编号 需要减去的值$n1 3 0 2 10 1 20
1 10
2 1
1 2
3 1
2 2
1 3
<?$e5=$e4+($pb-1-$f1)*$i3?>
其中,$f1表示数据组的编号。用上述获得$p页数同样的方法来获得$f1,如下:
$j1=$i-$w5;
$f1=ceil($j1/$i3);?>
if ($a5){if ($pa==1){$w6=$a5;$e6=$a5;}
if ($pa>1){$w5=$w5-($w3-$a5);$w6=$w3+$w5-1;}
$p=ceil(($e1-$a5)/$i3)+1;}
if ($w6>$e1) $w6=$e1;?>
版权声明:
本博客所有文章,均符合原创和创作共用的定义,请勿转载。如需引用本博客的文章全文,复制本博客文章的网址即可。
相关的链接:
和平海底1 | Auciou | 自由勇专栏 | UFO问答
呼叫星际联邦/祈祷 | 我们看不见外星人的原因
郝相国先生星际联邦接触官方网站
文章分类 Category:
编程 | PHP | 互联网 | 真相与UFO | JavaScript
BBS社区研究 | QQ研究 | Blog的发展 | 生活
食虫植物
Gratitude | 食虫植物
Blog存档 Archives:
2010年09月 | 2010年08月 | 2010年07月
2010年06月 | 2010年05月 | 2010年04月
2010年03月 | 2010年02月 | 2010年01月
2009年12月
近期的主题:
蚊子要不要清除?
活水苔的获得
糟糕的Flash Player 10.1.82.76:全屏白屏
document.body.innerHTML出现“操作已终止”解决一例
养食虫植物增加空气湿度的简单方法
日记随笔:论坛程序再次开发完成
地球扬升与家人、朋友
日记随笔:2010-07-09
梦见第四密度和梦见飞碟
日记:2010-06-05 音乐
感谢郝先生!
所有人都可以直接参与百度贴吧的管理
坚守真诚到永远
有关30年后的未来人的帖子
每天的时间太有限
伏尔加河大桥扭曲事件之感想
善良的人在灾难中遇难怎样解释
有关星际联邦是否降落
郝相国先生与外星人接触进展(6)
郝相国先生与外星人接触进展(5)