> ╮( ̄▽ ̄)╭,话说上次函数有一点点的小杯具。Qiqiboy 表示,那函数效率灰常低,而且忘记用除法鸟。
> 小邪表示灰常蛋疼,所以进行了大量研究,恩恩,灰常大量,因为 Chrome 标签已经看不到标题鸟。

一. 代码改进:
> 先让我们一起研究一下原先的代码,貌似效率特别低,o(╯□╰)o 杯具,当时小邪滴脑袋木有转过弯来。
> 居然没有想到除法取整,愣是用循环达到除法的目的,额滴神,(PД`q。)·。'゜ 冰天雪地掩面泪奔。
foreach ($info as $val) {
$count = 0;
while ($inte - $val[0] > 0) {
$inte = $inte - $val[0];
$count++;
}
if ($count<>0) { $res .= $count.$val[1]; }
}
//foreach 要执行四次,因为 $info 数组的外层数组有 4 维
//如果时间差恰好为 1 天,While 要执行最少 24 次,最多 23+59+59 次
//每次 While 的时候,$count 要自加一次,$inte 要减一次
//总的来说,时间为一天的话,大概执行了 141*4 次自加和减法
//如果时间不止一天而是一年的话,就杯具了,超多 - -
> 话说 Qiqiboy 说的以前有更好的代码,小邪好像没有找到,要么是判断超多的,要么也有不少循环。
> Qiqiboy 上次说:"而且你用foreach会和数组中每个数值进行比较一遍做判断,这个也可以避免"。
> 唔,关于这个问题,要么除了用超多的判断来代替循环,小邪倒是木有想到其他的可用过程。
> 所以这次依然使用循环来看看,感觉超多的判断开销其实也不小,还不如省一些代码的空间来着。
foreach ($info as $val) {
if ($inte >= $val[0]) {
$tmp = floor($inte/$val[0]);
$res .= $tmp.$val[1];
$inte = $inte - $tmp*$val[0];
}
}
//虽然还是有 foreach 函数,不过这个提供了可定制性,具体下面有介绍
//Foreach 循环四次,每次循环进行一次判断、一次除法取整、一次减法乘法
//无论时间为多长,只会进行 4 次判断、除法、取整、减法、乘法,感觉应该蛮好的
二. WP个性化评论时间函数 v1.01:
/* 小邪的个性化评论时间函数 v1.01 Start */
function evlos_funtime($gmto) {
$set = 7*24*60*60; //在这里设定要个性化时间的秒数范围
$gmt = strtotime($gmto);
$inte = strtotime(gmdate('Y-m-j G:i:s')) - $gmt;
$info = array(array(86400,'天'),array(3600,'小时'),array(60,'分钟'),array(1,'秒'));
//你可以自由定制,可以去除 ,array(1,'秒') 这样就只会精确到分钟
if ($inte <= $set) {
foreach ($info as $val) {
if ($inte >= $val[0]) {
$tmp = floor($inte/$val[0]);
$res .= $tmp.$val[1];
$inte = $inte - $tmp*$val[0];
}
}
if ($res=='') {$res='0s';}
echo $res = '在'.$res.'之前';
}
else {
echo $res = date(get_settings('date_format').' \a\t '.get_settings('time_format'),$gmt+get_settings("gmt_offset")*3600);
}
}
/* 小邪的个性化评论时间函数 v1.01 End */
三. 关于这个函数的可定制性:
$info = array(array(86400,'天'),array(3600,'小时'),array(60,'分钟'),array(1,'秒')); //你可以自由定制,可以去除 ,array(1,'秒') 这样就只会精确到分钟 //可以在 array(86400,'天'), 前面增加 array(604800,'周'), 来显示单位周 //还可以增加 array(2592000,'月'), 来显示单位月 //注意,单位一定要从大到小排列,不然会杯具喔 _( ̄0 ̄)_
四. 用官方函数的超短代码:
> Human_time_diff 函数 - http://codex.wordpress.org/Function_Reference/human_time_diff
<?php echo human_time_diff(get_the_time('U'), current_time('timestamp')) . '之前'; ?>
//日志发布时间个性化
<?php echo human_time_diff(get_comment_time('U'), current_time('timestamp')) . '之前'; ?>
//评论时间个性化
//注意咯,这个函数只提供 "x分钟之前" "x小时之前" "x天之前" 的效果,木有 "x分钟x秒之前"
> 把上面的这些放到需要显示个性化时间的位置即可,具体可查看上一篇文章的方法。
> 地址 - http://www.evlos.org/2010/08/03/comments-date-style

<?php echo human_time_diff(strtotime($comment->comment_date_gmt), strtotime(gmdate('Y-m-j G:i:s'))) . '之前'; ?>
//你知道的,因为小邪VPS时间杯具事件,所以不得不绕一个大弯,o(╯□╰)o
//时间正常的童鞋请拿上面的代码,而这里的代码能在时间最杯具的时候挺住 ( ̄y▽ ̄)╭ Ohoho ..
五. 奇特的 Floor 取整函数:
$int = 9.99; echo floor($int); // returns 9 $int = 4.55555; echo floor($int); // returns 4 $int = 1.11111; echo floor($int); // returns 1 $int = 0.99999999999999999; echo floor($int); // returns 1 $int = 0.9999999999999999; echo floor($int); // returns 0 $int = -2.44; echo floor($int); // returns -3
六. 尾记:
> o(* ̄▽ ̄*)ゞ 嘿嘿,小邪 9 号要到韩国去旅行,大概有 5 天左右,打算要去强力围观一下棒子们。
沙发!
@MOPVHS ,
左顾右盼...真的是沙发...
我效率真高,跟这次改进后的函数效率一样高~~~
@MOPVHS , 哈哈,你比他们都快了 3 分钟呐 ~
@MOPVHS , 沙发奖励春哥一只 ~
板凳?
@阿邙 , 板你个凳哦也
阿邙 在之前 ~ 刚发的不显示时间
@阿邙 , 看看盖楼能到几层
@阿邙 , 哈哈,COOL板凳 ~ :biggrin:
嗯 qiqi毕竟是写算法的 经常在jol做题 所以效率问题一看就看出来了
@丕子 , 哇靠,他太强了,经常做算法题 - - ~
小邪最怕的就是算法题,做多了想屎 ~ :exclaim:
不懂PHP的人纯围观之……
@dudo , 专心被围观中 ~ :biggrin: :biggrin:
越折腾,越健康
@N , 嘿嘿,无尽的折腾 ~ 才是生活的乐趣 ~
我勒个去..9号就走了...
@mice , 唔,出去 5 天嘛 ~
@邪 罗刹 , 咱俩生活在一个太阳下了
@mice , 嘿嘿嘿,load average: 0.14, 0.37, 0.33 ~
鸭梨不大,放心,吼吼吼 ~
@mice , 报告长官 - load average: 0.35, 0.33, 0.27 ~
鸭梨还行,能挺住 ~
等我把所有订阅文章搞定再来仔细看看
@mice , 阅读器未读数每天有 4000+ 的杯具男路过 ~
哇,真爽哈,见棒子去了~
@小松 , 哈哈,围观一下棒子 ~ 看看他们的内部结构 ~
N久没看见了,灌一水 :redface: :redface: :redface:
@小雯子 , 让暴风雨来的更猛烈一些吧 ~

其实我本来想说的,为啥不用我前段时间写的文章里面的 Human_time_diff wp内置函数呢?我以为小邪知道
@zwwooooo , 杯具,你前段时间写的文章小邪后来忘记了 ~
结果只看到万戈的 ~ ╮( ̄▽ ̄)╭
Human_time_diff 这个要是加上几秒就好了
@winy , 恩,这个只显示一个单位,不好玩 ~ o(*^▽^*)o
我一直用的Human_time_diff
@阿修 , 杯具,小邪孤陋寡闻鸟 ~ (PД`q。)·。'゜冰天雪地掩面泪奔……
这是什么东西?
@bolo , 囧,这个是显示 “bolo 在5小时6分钟之前” 的东东 ~
算法的复杂度问题……
@Ray Chow , ╮( ̄▽ ̄)╭,算法的蛋疼问题 ~
改进版强大。。要拿来用。

@柳城 , 呵呵,荒淫拿去玩 ~ :biggrin:
真是看不懂啊 呜呜
@su , 所以大家来小邪这里的时候都是很淡定的 ~
如果我添加了从年到秒这么多单位,相隔时间超过一年后,也会显示XX年XXyueXX周XX。。。XX秒这样吧。。
如果我只想显示最多的最大的三个单位呢?比如有年的话只显示年月周。。?
@QiQiBoY , 唔,在 foreach 的 if 语句里面加一个计数器 ~
到 3 就 break ~ :biggrin: :biggrin:
关于你说floor的问题,它返回一个小于传入值的整数。你举的例子中1、2、3、5、6都没什么疑问吧。。4之所以会取1,是因为数值太小溢出了。。
@QiQiBoY , 膜拜+100 ~
4之所以会取1,是因为数值太小溢出了。。//一针见血,就是这里不懂
实在是应该找时间找比较容易的特效来折腾下
@秦大少 , 呵呵,折腾中提高自己,而且蛮有意思的喔 ~

这个你都研究的这么透,厉害
@先看看 , 呵呵,还好啦 ~ 革命还木有成功 ~
同志们都还在努力 ~ :redface: :redface: :redface:
小邪每天都在研究时间。。。写个时间简史吧。。。
@路人假 , - -,小邪还想写个相对论来着 ~
前面的减法那时居然看不明白。。除法的大概明白了~~
@fatkun , 囧,前面减法是小邪迷糊鸟 ~
没想到让大家也迷糊了 ~ :redface: :redface:
呼噜呼噜呼噜的闪过,看完就昏昏欲睡了。
@FORECE , 嘿嘿,碎个好觉哈 ~
居然官方也出这函数了呀,hiahia~
@万戈 , 呵呵,以后小邪闲的蛋疼就去解剖官方函数文件 ~
@surda , 花姑娘在哪里?

测试一下
围观下, 我不属于技术流的人.
@绝版黑色 , 乖乖被围观中 ~