1.php中的数组就是内存里有一块连续的内存空间(堆空间),可以保存多个数据,数据之间没有数据类型的限制。
2.与其他语言的区别:
1.php数组没有长度限制。(c语言必须指定数组长度,超出长度会溢出)
2.php数组没有数据类型限制。(c语言必须声明存储的数据类型)
3.数组的下标可以是数值或者字符串
3.数组的基本语法
1.显示数组语法
$arr = array(element1,element2,element3);
2.隐式数组写法
$arr[] = element1;
$arr[] = element2;
3.数组的结构
①array(②5) {
[③0]=>
string(6) "④李白"
[1]=>
string(3) "男"
[2]=>
int(55)
[3]=>
int(180)
[4]=>
int(140)
}
①.类型是数组
②.数组元素的个数
③.数组元素的下标
④.元素值
4.访问数组
数组的本质也是变量。
访问的时候直接使用变量,但是因为数组元素有多个,而系统没有办法
直接区分到底用户是访问的哪一个,所以需要用户在访问的数组的时候,使用数组下标(键名)访问
语法:$数组变量[下标]
5.数组分类
根据数组的下标不同进行分类
索引数组:当前数组的下标(键名) 全是数字(整形)
关联数组:当前数组的下标全是字符串
混合数组:既有数字又有字符串
6.索引数组
1.系统自动分配索引序列号
$arr1 = array('q','w','e','r');// 等价于 $arr1 = array(0=>q'',1=>'w',2=>'e',3=>'r');
$arr2[] = 'a'; //$arr2[0] = 'a';
2.手动分配下标
$arr3 = array(3=>'b',2=>'c');
$arr2[3] = 'ab';
$arr4 = array('a',3=>'b','d');//0:a,5:b,6:c
3.系统分配索引方式
1.系统是0开始分配,依次递增1
2.用户可以手动分配下标(重复下标就是覆盖)
3.如果指定在某一处指定下标,那么后续元素自动分配的下标从前面的最大值索引开始
7.关联数组
下标必须用引号包含
下标不允许重复,重复会覆盖
$a = array('a'=>'a','b'=>'b','c'=>'c');
$a['d'] = 'd';
8.数组在内存的形式
9.数组遍历
1.索引数组遍历
1. 数组必须是索引数组
2. 下标必须是连续的
3. 索引必须从0开始
<?php
$week = array('星期一','星期二','星期三','星期四','星期五','星期六','星期日');
for($i=0; $i<count($week); $i++){
echo $week[$i].'<br>';
}
Foreach的使用
foreach($week as $k=>$v){
echo $k.'=>'.$v.'<br>';
}
Foreach原理
Foreach每次遍历的时候,会先重置指针。遍历完数组指针指向数组某端。
foreach($week as $k=>$v){
echo $k.'=>'.$v.'<br>';
}
var_dump(each($week));
0=>星期一
1=>星期二
2=>星期三
3=>星期四
4=>星期五
5=>星期六
6=>星期日
bool(false)
10.数组指针:
每个数组都默认有一个指针(定位符),默认指向数组的第一个元素。如果对数组使用循环遍历,那么该指针会在访问指针当前元素所指向的元素之后,将自己向下移动一位,指向下一个元素的地址。如果当指针遍历完最后一个元素,指针会继续下移,从而移除数据空间,从而再次对数组元素进行访问的时候,访问FALSE。
函数遍历数组
Each():每次从数组中获取当前数组指针所指向的元素,放回一个有四个元素的数组(关联+索引),并且将数组的指针下移一位。
Each本身不能重置数组指针。
Each配合循环while遍历数组
1. 如果each得到数组元素,就为真,进入循环体
2. 如果each得不到元素,返回false,进不进入循环体
While($e = each($arr)){}
List是一个语法结构,将得到数组里的元素,必须是以0开始的索引元素,对应赋值给list所指定的变量里。
语法:list($first,$seconde…) = array();
因为each返回结果有索引元素,一般和list配合使用。
List要求对应的数组里必须有比当前list结构所需要的元素多索引元素。
list($first,$second) = each($week);
echo $first,$second;//0星期一
List结构允许数组是一个false,从而不会去数组里取元素赋值给相对应的变量
while(list($f,$s) = each($week)){
echo $f,$s;//0星期一1星期二2星期三3星期四4星期五5星期六6星期日
}
List搭配each的好处:能够直接将数组的元素取出来,且赋值给变量,而在后续的程序中可以直接使用变量来操作。
11.二维数组
数组元素的值是一个数组数据类型。
Php不存在二维数组,刚好数组的值又是一个数组。C语言的二维数组是两个维度。
$arr = array(
'p1' => array('name'=>'令狐冲','power'=>'独孤九剑'),
'p2' => array('name'=>'田伯光','power'=>'快刀'),
'p3' => array('name'=>'任盈盈','power'=>'琴箫合奏')
);
foreach($arr as $k=>$v){
echo $v['name'].':'.$v['power'].'<br>';
}
12.数组相关函数
$hero = array(
'name' => '郭靖',
'power' => '九阳神功'
);
Key:获取当前数组当前指针所指向元素的下标。
echo key($hero);//name
Current:获取当前数组指针所指向的元素的值。
echo current($hero);//郭靖
Next:返回数组当前指针所指向下一位元素的值,并指针下移一位。如果当前指针在数组元素的最后一个元素,返回false,指针依然下移一位。
echo next($hero);//九阳神功
echo key($hero);//power
prev:返回当前指针所在位置的前一个元素,并且指针向前移一位。
echo prev($hero);//郭靖
echo key($hero);//name
var_dump(prev($hero));//false
var_dump(key($hero));//null
如果指针一旦移除数组,那么都不能通过next或prev将指针拉回。
Reset:重置数组指针,让数组指针指向第一个元素。成功返回数组元素第一个值,失败返回false;如果数组第一个元素被删除,那么指针重置之后,是第二个元素。
var_dump(reset($hero));//string(6) "郭靖"
end:获取数组元素最后一个元素的值,也是将指针指向最后一个元素。End也有重置指针的功能。
Array_keys:获取数组的所有下标,返回一个索引数组
var_dump(array_keys($hero));//{ [0]=> string(4) "name" [1]=> string(5) "power" }
array_values: 获取数组的所有值,返回一个索引数组
var_dump(array_values($hero));//array(2) { [0]=> string(6) "郭靖" [1]=> string(12) "九阳神功" }
php没有数据结构,但可以用数组模拟
下面四个函数都是针对原数组进行值操作
array_push:从数组的尾端加入一个元素
array_pop:从数组的尾端弹出一个元素
array_shift()从数组头部将元素移出
array_unshift();从数组头部插入数据
数组与字符串之间的转换
Explode:将字符串按照指定的分隔符分解成一系列小字符串,都成为
数组的一个元素
Implode:将一个数组里的所有的元素按照某个分隔符进行拼接,变成一个字符串
Range:按照ASCII码能够指定范围,生成一个索引数组
数组合并: +和array_merge()
+:保存第一个数组的所有元素,如果后面的数组的元素与前面数组的元素的下标相同,那么就忽略,如果不同则加到第一个数组里,最终返回一个数组
array_merge():先保留第一个数组的所有元素,如果后面数组的元素与前面数组的元素关联下标相同则用后面数组的元素覆盖前面的;如果是索引下标,直接添加到第一个数组后面,重置索引。
$a = range(1,9);
$b = range('a','z');
var_dump($a+$b);//26个元素
var_dump(array_merge($a,$b));//35个元素
array_rand:从数组中随机取出指定长度的个数的元素下标
shuffle:将原来的数组里的元素打乱,对原数组操作,引用传值。
$abc = array_merge(range(1,9),range('a','z'),range('A','Z'));
$key = array_rand($abc,4);
shuffle($key);
foreach($key as $v){
echo $abc[$v];
}
//字符串获取验证码
$str = "123456789abcdefghijklmnopqrstuvwysxzABCDEFGHIJKLMNUPORSTUVWZXT";
$yzm = '';
for($i=0; $i<4; $i++){
$num = mt_rand(1,61);
$yzm .= $str[$num];
}
echo $yzm;
数组的比较主要是比较数组长度,数组元素的值
==:要求数组长度一致,数组元素的值相等,下标也要相等
===:数组长度一致,值和类型都完全一致,出现的顺序必须也相同
$arr1 = array(1,2,3);
$arr2 = array(2,3,1);
$arr3 = array(1=>2,2=>3,0=>1);
var_dump($arr1 == $arr2);//false,下标对应的值也要相等
var_dump($arr1 == $arr3);//true
var_dump($arr1 === $arr3);//false