生成验证码---使用数组(及array_combine和array_merge的比较)
完整代码
<?php
header('content-type:text/html;charset=utf-8');
//使用数组生成4位随机验证码
$arr1 = range('a','z');
$arr2 = range('A','Z');
$arr3 = range(0,9);
// print_r($arr1);
// print_r($arr2);
// print_r($arr3);
//合并数组
$arr = array_merge($arr1,$arr2,$arr3);
// print_r($arr);
//随机从数组中收取4个元素
$keys = array_rand($arr,4);
// print_r($keys);
$yzm = '';
foreach($keys as $k){
$yzm .= $arr[$k];
}
echo $yzm;
输出结果:(因为随机数是不固定的,所以输出可以不太一样)
步骤:
1.使用rand函数输出a-z,A-Z,0-9的随机数
<?php
header('content-type:text/html;charset=utf-8');
//使用数组生成4位随机验证码
$arr1 = range('a','z');
$arr2 = range('A','Z');
$arr3 = range(0,9);
print_r($arr1);
print_r($arr2);
print_r($arr3);
输出结果:
2.使用array_merge把数组合并起来
array_merge
array_merge — 合并一个或多个数组
说明
array array_merge ( array $array1 [, array $… ] )
array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。
$arr = array_merge($arr1,$arr2,$arr3);
print_r($arr);
输出结果:
Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f [6] => g [7] => h [8] => i [9] => j [10] => k [11] => l [12] => m [13] => n [14] => o [15] => p [16] => q [17] => r [18] => s [19] => t [20] => u [21] => v [22] => w [23] => x [24] => y [25] => z [26] => A [27] => B [28] => C [29] => D [30] => E [31] => F [32] => G [33] => H [34] => I [35] => J [36] => K [37] => L [38] => M [39] => N [40] => O [41] => P [42] => Q [43] => R [44] => S [45] => T [46] => U [47] => V [48] => W [49] => X [50] => Y [51] => Z [52] => 0 [53] => 1 [54] => 2 [55] => 3 [56] => 4 [57] => 5 [58] => 6 [59] => 7 [60] => 8 [61] => 9 )
注:我们会发现,它的索引号发生了变化
3.我们使用array_rand函数返回当前元素所在的键
//随机从数组中收取4个元素
$keys = array_rand($arr,4);
print_r($keys);
4.我们使用foreach循环,得到键所对应的值
$yzm = '';
foreach($keys as $k){
$yzm .= $arr[$k];
}
echo $yzm;
array_rand
array_rand — 从数组中随机取出一个或多个单元
说明
mixed array_rand ( array $input [, int $num_req = 1 ] )
从数组中取出一个或多个随机的单元,并返回随机条目的一个或多个键。
参数
input 输入的数组。
num_req 指明了你想取出多少个单元。如果指定的数目超过了数组里的数量将会产生一个 E_WARNING 级别的错误。
返回值
如果你只取出一个, array_rand() 返回一个随机单元的键名,否则就返回一个包含随机键名的数组。这样你就可以随机从数组中取出键名和值。
array_merge的其他使用情况
$array1 = array( "color" => "red" , 2 , 4 );
$array2 = array( "a", "b","color" =>"green" , "shape" => "trapezoid" ,4);
$result = array_merge ( $array1 , $array2 );
print_r ( $result );
输出结果:Array
(
[color] => green
[0] => 2
[1] => 4
[2] => a
[3] => b
[shape] => trapezoid
[4] => 4
)
注:因为color相同,两个键是字符串,而不是说数字,所以green会覆盖red。如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。
$array1 = array();
$array2 = array( 1 => "data" );
$result = array_merge ( $array1 , $array2 );
输出结果:Array
(
[0] => data
)
注:别忘了数字键名将会被重新编号!
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。
如果你想完全保留原有数组并只想新的数组附加到后面,用 + 运算符:
$array1 = array( 0 => 'zero_a' , 2 => 'two_a' , 3 => 'three_a' );
$array2 = array( 1 => 'one_b' , 3 => 'three_b' , 4 => 'four_b' );
$result = $array1 + $array2 ;
var_dump ( $result );
输出结果:array(5) {
[0]=>
string(6) “zero_a”
[2]=>
string(5) “two_a”
[3]=>
string(7) “three_a”
[1]=>
string(5) “one_b”
[4]=>
string(6) “four_b”
}
注:在3出现了重复的值,在一个数组中不可能出现两个键名相等的元素,所以arr1的3将会替代$arr2中的3,同时键名将以连续的方式重新排布.
array_combine
array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
$nos = array(1001,1002,1003);
$names = array('张三','李四','王五');
$arr = array_combine($nos,$names);
print_r($arr);
Array ( [1001] => 张三 [1002] => 李四 [1003] => 王五 )
比较array_combine和array_merge的区别
$a = array('green','red',‘yellow');
$b = array('avocado','apple','banana');
$c = array_combine ($a,$b);
print_r ( $c );
输出结果: Array
(
[green] => avocado
[red] => apple
[yellow] => banana
)
$a = array( 'green' , 'red' , 'yellow' );
$b = array( 'avocado' , 'apple' , 'banana' );
$c = array_merge ( $a , $b );
print_r ( $c );
输出结果:Array ( [0] => green [1] => red [2] => yellow [3] => avocado [4] => apple [5] => banana )