首页 > 代码库 > 利用PHP内置函数制作一个简单的验证码
利用PHP内置函数制作一个简单的验证码
因为这两天学习了一些PHP的内置函数,所以今天就用一些内置函数配合数组来简单的制作一个随机验证码的效果。
例如:2dT5 T22c....
分析:首先分析验证码的组成:
1.验证码是由数字1-9,大写字母A-Z,小写字母a-z 中随机生成的。
2.我先创建一个包含指定范围单元的数组。(这里应该是三个:数字,大写字母,小写字母)。
3.我可以将这些数组合并成一个大的数组
4.随机打乱该函数。ps:其实觉得在这里再做一步将数组随机打乱,感觉也没有什么必要啊!因为后面我们做的不也是随机抽取吗?
5.在这个新的数组中随机抽取四次。(这里需要分两步实现,第一步:利用array_rand()函数从数组中随机取出四个单元,并返回随机条目的一个或多个键(多个返回的是一个数组,像这里就是返回一个包含四个元素的数组) 第二步:利用下标打印出这个数就可以了);
利用的一些内置函数:
(1)range():建立一个包含指定范围单元的数组
1 例如: 2 // array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) 3 foreach ( range ( 0 , 12 ) as $number ) { 4 echo $number ;
(2)array_merge():合并一个或多个数组
形式:array array_merge ( array $array1 [, array $... ] )
1 例子: 2 <?php 3 $array1 = array( "color" => "red" , 2 , 4 ); 4 $array2 = array( "a" , "b" , "color" => "green" , "shape" => "trapezoid" , 4 ); 5 $result = array_merge ( $array1 , $array2 ); 6 print_r ( $result ); 7 ?>
1 输出的结果: 2 Array 3 ( 4 [color] => green 5 [0] => 2 6 [1] => 4 7 [2] => a 8 [3] => b 9 [shape] => trapezoid 10 [4] => 4 11 )
(2)shuffle() 将数组打乱
形式:bool shuffle ( array &$array
) 注意;它返回的是一个布尔值(TRUE 或者FALSE)
重点提示:因为利用这个随机函数之后返回的是一个布尔值,所以我们不能以自己的思维觉得我随机打乱了就让它输出看一下,这种做法是错误的,我在第一次利用的时候也犯了同样的错。
解释:这里就是我第一次放的错,我以为这样子就可以得到一个打乱完的数组了,其实他真正返回的就是一个布尔值,告诉我们是否打乱成功而已。
修改版:
1 <?php 2 header("content-type:text/html;charset=utf-8"); 3 //创建一个数组 4 echo "<pre>"; 5 $arr1 = range(1,9); 6 var_dump($arr1); 7 //将数组随机打乱 8 shuffle($arr1); 9 var_dump($arr1);
(4)array_rand() 从数组中取出一个或多个随机的单元,并返回随机条目的一个或多个键(多个的话就是一个数组)
形式:mixed array_rand ( array $input
[, int $num_req
= 1 ] )
1 例子: 2 <?php 3 $input = array( "Neo" , "Morpheus" , "Trinity" , "Cypher" , "Tank" ); 4 $rand_keys = array_rand ( $input , 2 ); 5 echo $input [ $rand_keys [ 0 ]] . "\n" ; 6 echo $input [ $rand_keys [ 1 ]] . "\n" ; 7 ?>
接下来我们就开始实现一下这个验证码的生成过程:
1 <?php 2 header("content-type:text/html;charset=utf-8"); 3 //创建三个数组 4 $arr1=range(1,9);//创建1-9的数组 5 $arr2=range("a","z");//创建小写字母的数组 6 $arr3=range("A","Z");//创建大写字母的数组 7 //将这三个数组组合成一个数组 8 $arr4=array_merge($arr1,$arr2,$arr3); 9 shuffle($arr4);//讲数组打乱 10 $arr5=array_rand($arr4,6); 11 $arr6=array_rand($arr4,4);//从数组中随机取出四个单元,并返回随机条目的一个或多个键(多个返回的是一个数组,像这里就是返回一个包含四个元素的数组) 12 $str7=$arr4[$arr6[0]].$arr4[$arr6[1]].$arr4[$arr6[2]].$arr4[$arr6[3]];//组合 13 $str8=$arr4[$arr5[0]].$arr4[$arr5[1]].$arr4[$arr5[2]].$arr4[$arr5[3]].$arr4[$arr5[4]].$arr4[$arr5[5]]; 14 echo "你本次的4位验证码是:".$str7."<br />"; 15 echo "你本次的6位验证码是:".$str8;
执行结果:
总结:1.其实这个代码还是存在一定的问题,因为他是一次性在里面取出四个元素,计算机的这个操作的输出结果是它取到的这四个元素不会存在相同的情况,但是生活中的实际情况是我们输入的验证码是会存在相同的情况,比如两个小写a,两个大写B,又或者两个1,这都是可以产生的。
2.还可以做一个优化,就是我们可以不考虑大小写,或者空格的存在,因为我们都知道,当我们进行验证码验证的时候,即使显示的是大写,我们输出小写也是可以的,当然,这个通过内置函数也是可以实现的。
3.另外的算法思路。其实做这个案例自己也想了其他的一些算法,也是可以实现的。
结语: 也许在一些有更好思路的人看起来这可能有点low,但是对于刚学这些函数的我来说,其实还是挺好玩的,所以有兴趣的也可以试着玩一玩。
利用PHP内置函数制作一个简单的验证码