文章归档算法详解

文章归档功能就类似本博客栏目的归档功能,归档列表布局是ul动态嵌套一些li,而li标签内容是由“文章发表年月+文章数”组成的,链接地址为博客的搜索页面,传递的参数为“文章所在年月”。

要实现这个功能,第一步就要先把文章表中所有文章的发表时间查询出来。

注:本处文章发表的时间数据库类型为整形,ar_queryByCase()方法为封装的Mysqli查询函数,函数返回值为结果数组。

/**
 * 本函数等价于执行SQL[article为文章表,ctime为文章发表时间字段]
 * select ctime from article order by ctime;
 * /
$archive=$article->ar_queryByCase(
	array(
		array(),
		'order'=>'order by ctime'
	),
	array('$ctime')
);                    

这样我们就可以得到类似于以下这样的结果数组。

Array
(
    [0] => Array
        (
            [0] => 1348830449
        )

    [1] => Array
        (
            [0] => 1348830477
        )

    [2] => Array
        (
            [0] => 1348830507
        )
)       

第二步,为了更好的操作这些时间,需要使用date()函数对时间进行格式化,即要或得文章发表时间的年月。为了方便起见,这里用另一临时数组接收结果。

$temp=array();
foreach($archive as $key=>$val){
	$temp[$key][0]=date('Y',$val[0]);
	$temp[$key][1]=date('m',$val[0]);
	$temp[$key][2]=1;
}
$archive=$temp;

这样的话,现在的结果数组就类似与这样的结构。

Array
(
    [0] => Array
        (
            [0] => 2012
            [1] => 09
            [2] => 1
        )

    [1] => Array
        (
            [0] => 2012
            [1] => 09
            [2] => 1
        )

    [2] => Array
        (
            [0] => 2012
            [1] => 09
            [2] => 1
        )
)

数组的第三个元素为文章所处月份发布文章的数目标量。我们用一个函数读这个结果数组进行处理,处理结果就是把数组的第一个、第二个元素相同,即文章发表的年、月相同的元素去掉,并修改发表数目这一标量的值。

function getFormatTime($arr=array()){
	$result=array();
	$y=0;
	$m=0;
	$key=0;
	foreach($arr as $index=>$value){
		if($value{0}==$y&&$value{1}==$m){
			$result[$key][2]++;
		}else{
			$y=$value{0};
			$m=$value{1};
			$key=$index;
			$result[$key]=$value;
		}
	}
	return $result;	
}
$archive=getFormatTime($archive);

这样再看一下处理后的数组元素,我们就可以得到类似于以下这样的结构。

Array
(
    [0] => Array
        (
            [0] => 2012
            [1] => 09
            [2] => 3
        )
)

这样数组处理部分已经搞定,就剩下最后一步,遍历这个数组,把内容显示在前台界面了,还是用ul和li布局,为了演示方便,就不给每个li的内容加链接了。

foreach($archive as $row){
	echo '<li>'.$row{0}.'年'.$row{1}.'月('.$row{2}.')</li>';	
}

这样,功能就基本完成了,不过,有一需要注意的地方,从数据库中查出来的结果数组必须有序,否则的话,就得不到正确结果,这一点请一定谨慎。

发表评论

电子邮件地址不会被公开。 必填项已用*标注