带你学习世界上最好的语言PHP(八)
数组初步
数组是一种复合数据类型,是在内存中开辟一块连续的空间(堆区),里面可以保存多个不同类型的数据,而且没有长度限制!
数组的组成:数组,是由元素(element)构成的,每个元素都是数组中的成员!
元素与数组之间的关系有点类似于数学中的元素与集合之间的关系!
每个元素又可以分成两部分:
元素的名字:叫作元素的键(key)或者叫作元素的下标(index),元素的值:也叫作值(value)
所以,一个元素也叫作一个“键值对”(key/value)
创建数组:一般有两种方式进行创建,显示创建、利用array()创建
隐式创建
就是利用中括号语法来创建:
访问数组
数组里面有很多的元素,需要告知PHP到底要访问哪一个
就是利用数组名和元素下标组合起来访问,其实就是利用中括号语法
数组名[下标]
注意:不要省略掉下标的引号!如果省略掉了,PHP会先把下标解析成常量,如果找不到这个常量才会解析成普通的字符串!
数组的分类
按照键值之间的对应关系
索引数组
数组元素的键(下标),不用于表示其对应值的含义,仅仅用来表示其所在的位置!
1,典型的,当一个数组的下标全部省略掉的时候,系统会自动分配下标,从0开始,依次递增!表示该数组的索引位置!
2,当省略掉部分元素的下标的时候,系统也会自动给这些元素分配索引下标,其索引值是前面最大整型下标的值加1,如果前面没有索引下标,就从0开始分配!
注意:如果两个元素的下标值相同,那么后面元素的值会覆盖前面的,要注意不要造成元素的“丢失”!
3,默认的,数组的下标只能是整型或字符串类型,虽然语法上运行写其他的类型,但是在创建数组的时候会自动转换成整型或字符串型!
关联数组:指数组元素的键和值之间,存在着一定的对应关系,也就是元素的键能够表示元素的值的含义!
注意:整型下标的数组不一定就是索引数组,关键是看元素的下标与值之间是否存在一定的对应关系!
按照数组的维度。
一维数组:简单来说,一个数组内所有的元素的值都不是数组类型,就是一位数组
多维数组:超过一维都是可以叫多维,是指一个数组中的元素的值有部分或者全部又是一个数组
其实,从严格意义上来说,PHP中并不存在传统意义上的多维数组,而是其中的某些运算恰好又是一个数组而已!
注意:以上所有的分类,都只是逻辑上的分类,都只是元素的键和元素的值的类型不同而已,从语法上来说,所有的数组元素的本质都是键值对!
foreach遍历
所谓的遍历,就是依次得到并处理数组的每个元素!
典型的,就是使用foreach对数组进行遍历!
基本语法
如果,此时对元素的键不需要操作(没有实际意义),可以省略掉键变量的那部分:
几个细节
注意:foreach遍历的是对原数组的拷贝,所以有以下的几个语法上的细节:
1,保存值的变量$value,和原数组之间默认的是值传递关系,所以,如果在遍历的时候对数组进行修改,不会影响到原数组的改变!
2,$value与原数组之间也可以是引用传递,就是在遍历的时候在$value的前面加上&即可!
3,仅仅是数组值的变量才支持引用传递,键变量不支持
用for循环在实现数组的遍历
注意:上面的for循环遍历,只适合下标连续的索引数组,因为,我们是先得到数组的下标,然后再利用下标去访问数组的元素的值,但是,这种遍历不算是真正意义上的遍历,因为下标是元素的一部分,一定是先有元素,再有下标!
那么,为什么foreach可以直接找到数组元素的值呢?本质的原因是数组的指针!
数组的指针
其实,在每个数组内,都存在一个数组元素的指针(看不见摸不着),它负责指向某个数组的内的某个元素,被指向的这个元素称之为当前元素!
默认的,如果定义完一个数组后什么都不做,这个指针就应该指向该数组的第一个元素!
注意:既然指针指向了一个元素,而元素又是由键值对构成的,所以,我们应该可以获取到当前元素的信息,由两个函数分别完成的:
key:语句形式就是key(数组名),作用是获取数组当前元素的键!
current:语句形式就是current(数组名),作用是获取数组当前元素的值!
数组的指针总不能一直指向某一个元素不动
next:语句形式就是next(数组名),作用是将当前数值的指针下移一位!(最多只能移到到数组的最后一个元素)
思考:如何利用上面的几个函数,用for循环实现类似于foreach的功能?
但是,以上还不能完全实现foreach的功能,因为如果在进入for循环之前对指针的位置做了修改,那么for循环的时候数组的指针就可能非法!
此时,需要在进入for循环之前对数组的指针进行重置,也就是确保在循环开始之前数组的指针指向第一个元素!
是通过另外一个函数来实现的:
reset:语法是:reset(数组名) 作用是:对数组的指针进行初始化(重置,指向第一个元素)
foreach原理
foreach流程图
数组指针相关函数
prev:向上移动一次指针,previous的缩写
end:也是重置指针,不过是将指针重置到最后的一个元素
注意:如果指针已经非法,就不能再做相对移动了(next、prev),但是可以做绝对移动(reset、end)
while-each-list遍历
each:还有一个功能非常强大的函数,就是each函数,语法是:
each(数组名)
它的作用:同时兼备了key、current、next函数的功能,既可以获得当前元素的信息(键和值),又可以向下移动指针!
注意each的返回值:
把当前元素的键和值当成是另外一个数组元素的值重新创建了一个新的数组!
而且,为这两个值(原数组的键和值)分别创建了一个索引下标和关联下标:
其中关联的:key表示原数组当前元素的键,value表示原数组当前元素的值!
其中索引的:0表示原数组当前元素的键,1表示原数组当前元素的值!
所以:如果要访问原数组当前元素的键:$each[0]或$each[‘key’]
如果要访问原数组当前元素的值:$each[1]或$each[‘value’]
当然,此时依然需要在遍历之前对数组的指针进行初始化!
此时,与foreach相比,唯一的不同就是不能直接在循环体内使用当前元素的键变量和值变量,可以用list函数来解决
list 作用:利用一个索引数组,一次性为多个变量进行赋值!
原理:先找到后面数组中哪个元素的下标为0,然后赋值给前面list中的第一个变量,然后找后面数组中的那个元素的下标为1,再赋值给前面list中的第二个变量,依次类推!