深思 PHP 数组遍历的差异(array_diff 的实现)

所属分类: 网络编程 / PHP编程 阅读数: 912
收藏 0 赞 0 分享
前两天看到有人要编个考试系统,当时只是简单回了下用随机函数RND

  实际一般需要从数据库中随机提取N道题目。

  以下代码都基于VBS;

  通常的编写类似这样的

'产生不重复随机数
function rndarray(istart,iend,sum)
dim arrayid(),i,j,blnre,temp,iloop,eloop
redim arrayid(sum-1)
i=0
iloop=0
eloop=0
blnre=false
randomize
do while i<sum
temp=int(rnd*(iend-istart+1)+istart)
if i=0 then
arrayid(0)=temp
i=i+1
iloop=iloop+1
else

for j=0 to i-1
if arrayid(j)=temp then
blnre=true
iloop=iloop+1
exit for'这一句很重要,防止多余的循环
else
iloop=iloop+1
end if
next

 if blnre=false then
 arrayid(i)=temp
 i=i+1
 else
 blnre=false
 end if

end if
eloop=eloop+iloop
iloop=0
loop
rndarray=join(arrayid)&"循环次数:"&eloop
end function

response.write rndarray(1,10,5)&"<br>"'调用过程


  PS。其中的iloop、eloop是为了计算循环次数而已。

  以上,大多数人的都是用这种方法编写的,生成一个随机数,然后再和以前生成的做比较,判断是否可用;

  但这不是一种AI的,或者说有效率的方法,为什么不用两个数组呢?

  数组1,存放需要的字符串,或数字等,数组2存放生成的随机数;当每次随机生成中间变量temp的一个下标x,赋给数组2,然后从数组1中,去掉下标为x的数字,赋给中间变量temp;这样每生成一个随机数,就从数组1中拿掉这个数,下次再生成一个数就不会重复了,这种产生随机数的方法原理实际是从数组1中提取。

  方法二

function rndstr(istart,iend,isum)
dim i,j,vntarray()
redim vntarray(iend-istart)
j=istart
for i=0 to iend-istart
vntarray(i)=j
j=j+1
next

dim vntarray2(),temp,x,y
redim vntarray2(isum-1)
y=iend-istart+1
x=0
temp=vntarray
do while x<isum
dim a
randomize
vntarray2(x)=temp(int(rnd*y))
a=" "&vntarray2(x)&" "
temp=split(trim(replace(chr(32)&join(temp)&chr(32),a," ")))
x=x+1
y=y-1
loop
rndstr=join(vntarray2)
end function

response.write rndstr(1,5,2)


  这样,是不是更简单呢

  展开一下,假如要生成随机字符串,包含字母数字时,仅需为数组1赋值时,用函数chr(num);

  假设,需要做一个手机中奖的页面程序。

  首先把值赋给数组1,可以130....~139....循环赋值,当然实际使用时从数据库中把已有的赋值,然后再随机提取赋给数组2;

  最后,再修饰一下

temp=replace(join(array2),chr(32),"")
phone=left(temp,6)&"***"&right(temp,2)

  得到类似137648***58的结果,呵呵

  写那么多,累死了~~

更多精彩内容其他人还在看

PHP 计算代码执行耗时的代码修正网上普遍错误

前几天测试 SQLite 插入大数据量的时候, 找了一些关于计算执行时间的代码, 发现网上普遍流传着这样一份代码
收藏 0 赞 0 分享

php中在PDO中使用事务(Transaction)

事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行
收藏 0 赞 0 分享

centos 5.6 升级php到5.3的方法

centos 5.6的库,更新比比5.5及时多了,居然已经有 php 5.3.3 了
收藏 0 赞 0 分享

rrmdir php中递归删除目录及目录下的文件

php自带的rmdir,只能删除空目录,这个rrmdir就可以递归删除目录及目录下的所有文件,不过使用起来要小心哦,不要把所有文件都删了
收藏 0 赞 0 分享

Views rows style模板重写代码

重写rows style模板,可以控制整个VIEWS的输出布局,就像VIEWS是个选择器,布局任你编排
收藏 0 赞 0 分享

PHP中break及continue两个流程控制指令区别分析

php中常用的for与foreach循环中,经常遇到条件判断或中止循环的情况。而处理方式主要用到break及continue两个流程控制指令,现在说明主要区别
收藏 0 赞 0 分享

SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享

问题:swfupload上传任何文件的mime类型均为application/octet-stream。
收藏 0 赞 0 分享

PHP session有效期session.gc_maxlifetime

PHP中的session有效期默认是1440秒(24分钟)【weiweiok 注:php5里默认的是180分】,也就是说,客户端超过24分钟没有刷新,当前session就会失效。很明显,这是不能满足需要的。
收藏 0 赞 0 分享

关于session在PHP5的配置文件中的详细设置参数说明

关于session在PHP5的配置文件中的详细设置参数说明,需要的朋友可以参考下。
收藏 0 赞 0 分享

PHP中的session永不过期的解决思路及实现方法分享

让PHP的session永不过期,你可能没有遇到这么郁闷的问题,但是我遇到过,很郁闷。
收藏 0 赞 0 分享
查看更多