php数组相关

复习:
匿名函数use用法:将外部和匿名函数处于同一级的变量引用到匿名函数的内部,引用的变量和外部的变量是一个值传递的关系。如果需要引用传址,则在usb变量前加&符号

迭代

单单从思想的角度上看,递归和迭代没有谁优谁劣,都是一样的,就和大家偏文科偏理科一样,但是,从代码的角度上来看,无疑是迭代的思想更加具有效率,所以建议大家以后去多用迭代的思想去解决问题。

数组

不是所有关联数组都是字符串下标
$arr = array(1110=>'刘德华',1111=>'金城武');
不是所有数组都是整形下标
$arr = array('a'=>'雪碧','b'=>'可乐','c'=>'王老吉');

foreach 遍历数组

语法:
foreach(需要遍历数组的名称 as 数组的键 => 数组的值){ }

语法:
foreach(需要遍历数组的名称 as 数组的值){ }

注意:

foreach遍历数组的时候,数组的指针会自动的下移。
foreach遍历完数组以后,指针会指向一个非法的位置
foreach在遍历数组之前,会现对数组做一个初始化的操作

foreach遍历数组,实际是遍历数组的拷贝值,改变原数组的结果,不会影响到遍历数组的结果,foreach遍历数组,如果改变$value的值,原数组不会发生变化

1
2
3
4
5
6
foreach($arr as $key => $value){
$value = '加多宝';
echo '数组的下标是:'.$key.'<br>';
echo '数组的值为:'.$value.'<br>';
}
var_dump($arr);

foreach遍历数组同样支持引用传值,改变$value的值,原数组也会随之发生变化。

1
2
3
4
5
foreach($arr as &$value){
$value = '加多宝';
echo '数组的值为:'.$value.'<br>';
}
var_dump($arr);

foreach遍历完数组以后,下标是一个不确定的情况,如果foreach遍历完以后需要使用数组,最好将他做一个初始化的操作。

指针 遍历数组

通过移动数组的指针,完成一个遍历数组的情况,指针指向的位置一般是分为一个合法位和非法位

next($arr) : 让指针下移一位–>指针下移
current($arr): 获取指针指向当前元素的值–>获取当前值
key($arr) : 获取指针指向当前元素的下标–>获取当前元素下标

for(;current($arr);next($arr)){
echo “数组元素的下标为:”.key($arr).’
‘;
echo “数组元素的值为:”.current($arr).’
‘;
}

prev() : 让数组的指针上移一位。

上移指针和下移指针是相对于现在的位置而言,所以一旦指针处于一个非法位置,没有参照物了,指针无论上移还是下移都是非法位

reset() : 初始化指针。
end() : 将数组指针指向数组的最后一个元素。

reset()和end()理解成相当于一个绝对路径的概念,我不需要管数组指针当前指向的位置,直接将数组指针指向第一个元素或者最后一个元素

each() :返回一个四个元素的数组,其中1和value代表当前数组指向的值,0和key指向当前数组的下标。并且他会让数组的指针下移一位

while+each+list 遍历数组

each可以获取元素的值,下标和下移指针,所以直接和while配合,就可以遍历数组
方法一

1
2
3
4
while($element = each($arr)){
echo '下标:',$element[0];
echo '值:',$element[1];
}

方法二

1
2
3
4
while(list($key,$value)=each($arr)){
echo '下标:',$key;
echo '值:',$value;
}

list() : list可以将数组里面的值赋值给一个变量

each获取的是一个数组类型的变量,所以可以利用list将数组的值获取出来

3种遍历数组的方式,for(),foreach(),while+each+list的方式,以后工作中90%的人基本上用的都是foreach,9%都会使用while+each+list的方法,for基本上没有人使用

关于赋值的指针问题

1
2
3
4
$arr=array(‘a’,’b’,’c’,’d’);
$arr2=$arr;
echo current($arr2);
//结果是 a,地址传递
1
2
3
4
5
$arr=array(‘a’,’b’,’c’,’d’);
next($arr);
$arr2=$arr;
echo current($arr2);
// 结果是b,复制数组的时候,指针跟着一起被复制
1
2
3
4
5
$arr=array('a','b','c','d');
$arr2=$arr;
next($arr);
echo current($arr2);
// 结果是a ,复制数组以后,修改一个数组的指针,另一个数组不会一起发生变化。
1
2
3
4
5
6
7
8
$arr=array('a','b','c','d');
next($arr);
next($arr);
next($arr);
next($arr);
$arr2=$arr;
echo current($arr2);
// 结果是a ,当一个数组处于一个非法位置的时候,复制给另一个数组,此时先查看哪个,哪个就会被初始化,另一个就不会初始化;

COW 写时复制

如果将一个变量赋值给另一个变量,不会立刻去开辟一个空间,只有当变量进行写操作的时候,才会给他开辟一个空间。

memory_get_usage() 获取文件占用空间的大小。
array_fill(开始下标,添加元素的数量,默认值)
shuffle() - 将数组打乱
array_fill() - 用给定的值填充数组

在foreach里面对原数组进行写操作时,复制的数组才开辟了一块空间

1
2
3
4
5
6
	header("content-type:text/html;charset=utf-8");
$arr=array('可乐','雪碧','王老吉');
foreach($arr as $key => $value){
}
var_dump(current($arr));
//指针停留在非法位,没有进行写操作。
1
2
3
4
5
6
7
	header("content-type:text/html;charset=utf-8");
$arr=array('可乐','雪碧','王老吉');
foreach($arr as $key => $value){
$arr[1]='加多宝';
}
var_dump(current($arr));
//结果为加多宝,foreach循环的是复制的原始数组,里面更改的也是原始数组。
1
2
3
4
5
6
7
8
9
	header("content-type:text/html;charset=utf-8");
$arr=array('可乐','雪碧','王老吉');
foreach($arr as $key => $value){
if($key==1){
$arr[1]='加多宝';
}
}
var_dump(current($arr));
//结果为王老吉,进行了写操作。
1
2
3
4
5
6
7
8
	$arr=array('可乐','雪碧','王老吉');
foreach($arr as $key => $value){
if($key==2){
$arr[1]='加多宝';
}
}
var_dump(current($arr));
//结果为可乐,复制数组的时候,指针处于一个非法位置,所以指针被初始化操作了。
1
2
3
4
5
6
7
8
9
	header("content-type:text/html;charset=utf-8");
$arr=array('可乐','雪碧','王老吉');
foreach($arr as $key => $value){
if($key==3){
$arr[1]='加多宝';
}
}
var_dump(current($arr));
//if语句一直没有被执行,所以一直没有进行写时复制。所以遍历完数组以后,指针指向非法位

foreach变量数组总结

先复制后移动,原始数组保持指针不变
先移动后复制,复制的数组会将指针也复制了
指针处于非法位置时,进行复制,先查看哪个数组,哪个就先被初始化

关于数组的几个函数

range(初始值,结束值)
$arr = range(1,10);

array_merge(数组1,数组2)
$arr = array_merge(range(0,9),range('a','z'));

array_merge如果合并两个数字下标的数组,会将数字重新从0进行组合。
array_merge如果合并两个字符串下标的数组,后面的值会将前面的值覆盖。
array_merge合并两个数组,先从第一个数组开始合并,然后在合并第二个数组。

array_rand(数组,个数);
随机获取一个数组的下标

array_rand获取的是元素的下标,如果只获取一个元素下标,则是以普通数据类型进行存储,如果获取多个下标,则以数组的模式进行存储。
虽然array_rand是随机获取下标的,但是他获取多个下标的时候会从小到大排序

shuffle()
可以打乱一个数组的元素

返回值是bool(true),

随机验证码

1
2
3
4
5
6
7
8
$arr = array_merge(range(0,9),range('a','z'),range('A','Z'));
$arr2 = array_rand($arr,4);
shuffle($arr2);
$str = '';
foreach ($arr2 as $value) {
$str.=$arr[$value];
}
var_dump($str);

补充:

memory_get_usage() 获取当前文件占用空间的大小;
array_fill(0,10,’uiste’); 0开始下标,10是元素个数,uiste是每个元素的内容