数组
数组:array,数据的组合,指将一组数据(多个)存储到一个指定的容器中,用变量指向该容器,然后可以通过变量一次性得到该容器中的所有数据。
定义语法
PHP中系统提供了多种定义数组的方式:
1、使用array关键字:最常用的
$变量 = array(元素1,元素2,元素3…);
2、可以使用中括号来包裹数据:
$变量 = [元素1,元素2,元素3…];
3、隐形定义数组:给变量增加一个中括号,系统自动变成数组
$变量[] = 值1; //如果不提供下标,系统自动生成(数字:从0开始)
$变量[下标] = 值; //中括号里面的内容称之为下标key,该下标可以是字母(单词)或者数字,与变量命名规则相似
PHP数组特点
1)可以整数下标或者字符串下标
如果数组下标都为数字:索引数组
如果数组下标都为字符串:关联数组
2)不同下标可以混合存在:混合数组
3)数组元素的顺序以放入顺序为准,与下标无关
4)数字下标的自增长特性:从0开始自动增长,如果中间手动出现较大的,那么后面的自增长元素从最大的值+1开始
5)特殊值下标的自动转换
布尔值:true/false
空类型:NULL
6)PHP中数组元素没有类型限制
7)PHP中数组元素没有长度限制
补充:PHP中数组是很大的数据,存储的位置是堆区,为当前数组分配一块连续的内存
多维数组
多维数组:数组里面的元素又是数组
二维数组:
多维数组:
在第二维的数组元素中可以继续是数组,在PHP中,没有维度的限制。
但是不建议使用超过三维以上的数组,会增加访问的复杂度,降低访问效率。
异形数组(不规则数组):
异形数组:数组中的元素不规则,有普通基本变量也有数组。
在实际开发中并不常用,尽量让数组元素规则化,便于进行访问。
遍历数组
数组遍历:普通数组数据的访问都是通过数组元素的下标进行访问,如果说数组中所有的数组都需要依次输出数来,就需要我们使用到一些简化的规则来实现自动获取下标以及输出数组元素。
$arr = array(0 => array(‘name’ =>’Tom’), 1 => array(‘name’ =>’Jim’)); //二维数组
//访问一维元素:$arr[一维下标]
$arr[0]; //结果:array(‘name’ =>’Tom’);
//访问二维元素:$arr[一维下标][二维下标]
$arr[1][‘nam’]; //结果:Jim
foreach遍历语法
基本语法如下:
foreach($数组变量 as [$下标 => ] $值){
//通过$下标访问元素的下标;通过$值访问元素的值
}
通常:如果是关联数组(字母下标),就需要下标。如果是数字下标,就直接访问值。
直接访问:
获取下标:
通常在进行数据存储定义的时候,通常二维数组不会两个维度的key下标都为数字,一般是一维为数字(无意义),二维为字符串(数据库表字段),所以在进行遍历的时候,通常是只需要针对一维进行遍历,取得二维数组元素,然后二维数组通过下标去访问。
foreach遍历原理
foreach遍历原理:本质是数组的内部有一颗指针,默认是指向数组元素的第一个元素,foreach就是利用指针去获取数据,同时移动指针。
foreach($arr as $v){
//循环体
}
1、foreach会重置指针:让指针指向第一个元素;
2、进入foreach循环:通过指针取得当前第一个元素,然后将下标取出放到对应的下标变量中(如果存在),将值取出来放到对应的值变量$v中;(指针下移)
3、进入到循环内部(循环体),开始执行;
4、重复2和3 直到在2的时候遇到指针去不到内容(指针指向数组最后)
for循环遍历数组
for循环:基于已知边界条件(起始和结束)然后有条件的变化(规律)
因此,for循环遍历数组由对应条件
1、获取数组长度:count(数组)得到数组元素的长度
2、要求数组元素的下标是规律的数字(起始和变化规律)
while配合each和list遍历数组
each函数的使用:each 能够从一个数组中获取当前数组指针指向的元素的下标和值,拿到之后将数组指针下移,同时将拿到的元素下标和值一个四个元素的数组返回:
0 下标 =》取得元素的下标值
1 下标 =》取得元素的值
key 下标 =》取得的元素的下标值
value 下标 =》取得元素的值
list函数的使用:list是一种结构,不是一种函数(没有返回值),是list提供一堆变量去从一个数组中取得元素值,然后依次存放到对应的变量当中(批量为变量赋值,值来源于数组):
list必须从索引数组中去获取数据,而且必须从0开始。
错误操作:变量多余数组元素,没有指定从0到指定变量的下标的数组元素。
list与each配合特别好:each一定有两个元素就是0和1下标元素。
list(变量1,变量2) = each(数组); // 是一种赋值运算,但是可以得到false结果,(each去不到正确的结果),整个表达式为false。(false代表数组到尽头了)
数组的相关函数
1)排序函数:对数组元素进行排序
sort():顺序排序(下标重排)
rsort():逆序排序
asort():顺序排序(下标保留)
arsort():逆序排序
ksort():顺序排序(按照键名(下标))
krsort():逆序排序
shuffle():随机打乱数组元素
2)指针函数:实现自定义循环
reset():重置指针,将数组指针回到首位,取得第一个元素的值
end():重置指针,将数组指针指到最后一个元素,取得最后一个元素的值
next():指针下移,取得下一个元素的值
prev():指针上移,取得上一个元素的值
current():获取当前指针对应的元素值
key():获取当前指针对应的下标值
注意事项:next和prev会移动指针,有可能导致指针移动到最前或者最后(离开数组),导致数组不能使用,通过next和prev不能回到正确的指针位置,只能通过end或者reset进行指针重置。
3)其他函数
count():统计数组中元素的数量
array_push():往数组中加入一个元素(数组后面)
array_pop():从数组中取出一个数组(数组后面)
array_shift():从数组中取出一个元素(数组前面)
array_unshift():从数组中压入一个函数(数组前面)
array_reverse():数组元素反过来
in_arrray():判断一个元素在数组中是否存在
array_keys():获取一个数组的所有下标,返货一个索引数组
array_values():获取一个数组的所有值,返回一个索引数组
array_slice(array $array , int $offset): 函数在数组中根据条件取出一段值,并返回。