这里说的虚拟的,是假的意思,表示数据并不是真实的,不得不说,虽然现在互联网主流还是好的,但是的确是充斥着很多虚假的数据,但是今天我们要做的这个东西,我并认为他有什么不对,只要我们东西是真的,而且真的是送的,我们这样来表现数据,仅仅是让用户的心情好一些,这有什么不对呢是吧。
这个是策划方案,我之前做过一个类似的,叫蓝环行动的专题:
功能地址:http://www.521php.com/archives/614/ 简述一些php对文件的操作,投票活动的实现
演示地址:http://www.tnbrj.com/s/lgxd/ 蓝光行动
这里演示页面如果能打开显示是100%,那就代表对了,因为活动日期做就过去了,当然是100%了。
这个蓝环行动的难点其实只是限制ip,并且根据开始和结束,根据当天的日期生成随机数,并且让那个环逐天上移。而今天这个功能,其实就是定义一个总数,开始和结束日期,每天生成一个固定的发放量即可。相对来说他的难点,是让今天和昨天和剩余有联系,这个数字在一定意义上说是随机的,但是对于某一天来说又是固定的,也就是说,效果是这样:
今日发放这个数字是变化的,但是一天中访问都是同一个值,而昨日真的是和昨天的今日发放数量是一样的,而剩余的,要是逐天减少的,而且有一些特殊如第一天,第二条等要和今日和昨日有关联。下面看一下代码:这里仅看看php代码,我直接输出了这三个值,如果要用,可以做为js来用,即<script src=”this.php”>这样来用,而且中间的获取日期$time我用字符直接指定了,可以把注释去掉,获取当天时间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
<?php //获取指定日期直接的天数 function numday($e='',$s=''){ $startdate=strtotime($s); $enddate=strtotime($e); $days=round(($enddate-$startdate)/3600/24)+1; return $days; } //获取前一天的日期 function qiant($t){ $s = date('Y-m-d',strtotime($t)-(3600*24)); return $s; } //根据日期产生固定随机数 function suiji($a,$t){ $num = date('j',strtotime($t)); if(is_even($num)){ if($num>($a/3)){ $n = round($num/3) + $a; }else{ $n = $num + $a; } }else{ if($num>($a/3)){ $n = $a - round($num/3); }else{ $n = $a - $num; } } return $n; } //判断是否为偶数 function is_even($num){ return (is_numeric($num)&(!($num&1))); } $num = 1000;//总数 $startTime = '2013-08-01'; $endTime = '2013-09-01'; $onceNum ='';//每天限制多少左右,不写,按总数除以天生的平均值左右 //$time = date('Y-m-d',time()); $time = '2013-08-15'; $sy = 0;//剩余 $jr = 0;//今日 $zr = 0;//昨日 if(''==$onceNum){ $numday = numday($endTime,$startTime); $onceNum = round($num/$numday); } if($time<$startTime){ $sy = $num; $jr = 0; $zr = 0; }elseif($startTime==$time){ $jr = suiji($onceNum,$time); $sy = $num - $jr; $zr = 0; }elseif($startTime==qiant($time)){ $jr = suiji($onceNum,$time); $zr = suiji($onceNum,qiant($time)); $sy = $num-$jr-$zr; }elseif($time<=$endTime){ !empty($numday)?$numday=$numday:$numday =numday($endTime,$startTime); $sy = $num-round($num/$numday)*(numday($time,$startTime))+suiji(10,$time); $jr = suiji($onceNum,$time); $zr = suiji($onceNum,qiant($time)); }elseif($endTime==qiant($time)){ $sy = 0; $jr = 0; $zr = suiji($onceNum,qiant($time)); }else{ $sy = $jr =$zr=0; } $sy<0?$sy=60:$sy=$sy; echo '<br />剩余'.$sy.'-今日'.$jr.'-昨日'.$zr; ?> |
这个功能虽然并不复杂也并没有太大的意义,但是他对应一个人的编程能力的确是有锻炼的,相对随机数这是我给他定义,其实也很简单,只不过这个还不是很全面,其实还可以再优化,比如其中的生成当天投放量的函数suiji(),这个可以优化,让他的数字更准确,我这里直接除以3其实是并不太准确的,其实应该根据天数和总数计算最好了,还有就是,我因为是测试,没有定下来开始和结束日期,如果定下来,其实可以做缓存,毕竟,如果每次访问页面都这样计算一下,感觉还是挺难受的,做为一个程序员就应该让程序运行起来更轻松,他也会累的。要考虑他的感受。
这个功能其实就分几个段,就是上面几个if,首先,活动开始前,肯定要让剩余为总是,今日和昨日都是0,再个就是第一天的时候,今日是根据自己写的规则产生的随机数,昨日为0,剩余就是总数减去今日;再个就是活动第二条,今日还是随机,昨日应该是第一天的,剩余就是总数减去今日和昨日的;然后就是活动期间,今日和剩余就是一个根据日期的随机数,昨日是昨天的今日数;最后就是结束的第二天,即剩余和今日都应该是0,昨日就是活动的最后一天的数;超过日期1天以上,就都是0了。
function suiji($a,$t)这个函数就是根据日期产生随机数的,还是有点意思的,其实很简单,上面说了,可以完善;
$sy = $num-round($num/$numday)*(numday($time,$startTime))+suiji(10,$time);
$jr = suiji($onceNum,$time);
$zr = suiji($onceNum,qiant($time));
这里是活动期间的计算过程,可以看一下,还是有点意思的;
程序本天成,妙手偶得之!我们只是代码的搬运工!
转载请注明:http://www.521php.com/archives/1416/