什么是数组?
PHP 中的数组实际上是一个有序映射。映射是一种把 values关联到 keys 的类型。keys似于酒店的房间号,values类似于酒店房间里存储的东西。如果你去某个酒店住店,服务员会告诉你房间号是多少,具体房间里有存储了什么,那就需要根据房间号进到房间里就知道了。变量只能储存一个数据,而数组则是多个变量的集合,数组就是将多个相互关联的数据组织在一起形成一个整体,作为一个单元使用。
如何定义数组?
可以用array()或者[]的方式来新建一个数组。它接受任意数量用逗号分隔的 键(key) => 值(value)对。
key只可以是 integer 或者 string。value 可以是任意类型。
当 key 是其它类型时发生转换:
包含有合法整型值的字符串会被转换为整型。例如键名 “8”实际会被储存为 8。但是 “08”则不会强制转换,因为其不是一个合法的十进制数值。
浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7实际会被储存为 8。
布尔值也会被转换成整型。即键名 true实际会被储存为 1,而键名 false 会被储存为 0。
Null 会被转换为空字符串,即键名 null实际会被储存为 “”。
数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
例如:
以上例程会输出:
上例中所有的键名都被强制转换为 1,则每一个新单元都会覆盖前一个的值,最后剩下的只有一个 “d”。
数组的类型?
根据 键(key) 的类型可以将数组分为:
索引数组– 带有数字索引的数组
关联数组– 带有指定键的数组
索引数组赋值有三种方式:
用数组变量的名字后面跟一个中括号的方式赋值,当然,索引数组中,中括号内的键一定是整数。比如,$arr[0]='苹果';
用array()创建一个空数组,使用=>符号来分隔键和值,左侧表示键,右侧表示值。当然,索引数组中,键一定是整数。比如,array('0'=>'苹果');
用array()创建一个空数组,直接在数组里用英文的单引号'或者英文的双引号"赋值,数组会默认建立从0开始的整数的键。比如array('苹果');这个数组相当于array('0'=>'苹果');
#1 PHP 数组可以同时含有 integer 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。如:
以上例程会输出:
#2 key为可选项。如果未指定,PHP 将自动使用之前用过的最大integer键名加上 1 作为新的键名。
以上例程会输出:
可以看到最后一个值"d"被自动赋予了键名7。这是由于之前最大的整数键名是6。
方括号语法访问和赋值数组单元
#1 数组单元可以通过array[key]语法来访问。
以上例程会输出:
Note:方括号和花括号可以互换使用来访问数组单元(例如 $array[42] 和 $array 在上例中效果相同)。
#2 自 PHP 5.4 起可以用直接对函数或方法调用的结果进行数组解引用,在此之前只能通过一个临时变量。
用方括号的语法新建/修改
可以通过明示地设定其中的值来修改一个已有数组。这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号([])。
$arr[key] = value;
$arr[] = value;
// key 可以是 integer 或 string
// value 可以是任意类型的值
如果$arr还不存在,将会新建一个,这也是另一种新建数组的方法。不过并不鼓励这样做,因为如果$arr已经包含有值(例如来自请求变量的 string)则此值会保留而[]实际上代表着字符串访问运算符。初始化变量的最好方式是直接给其赋值。
#1 要修改某个值,通过其键名给该单元赋一个新值。要删除某键值对,对其调用unset()函数。
如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上 1(但是最小为 0)。如果当前还没有整数索引,则键名将为。
#2 注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:
如何遍历数组?
三种遍历数组的方法:
使用for语句循环遍历数组;
使用foreach语句遍历数组;
联合使用list()、each()和while循环遍历数组。
这三种方法中效率最高的是使用foreach语句遍历数组。
#1 使用for语句循环遍历数组要求遍历的数组必须是索引数组。例如:
上面结果会输出:
数组第0值是:苹果
数组第1值是:香蕉
数组第2值是:菠萝
先计算出数组$fruit中元素的个数,然后才使用在for语句,更加高效的。因为如果是for($i=0;$i< count($arr);++$i)的话,每次循环都会计算数组$arr中元素的个数,而使用上面的方式可以减去这种开销。
#2 使用foreach语句循环遍历数组有二种方式,介绍如下:
第一种方式:
该方式只获取到数组的值(value)
第二种方式:
该方式连同键(key)也获取出来了
#3 联合使用list()、each()和while循环遍历数组
each() 函数需要传递一个数组作为一个参数,返回数组中当前元素的键/值对,并向后移动数组指针到下一个元素的位置。
list()函数,这不是一个真正的函数,是PHP的一个语言结构。list()用一步操作给一组变量进行赋值。
上面的代码会输出
0=>苹果
1=>香蕉
2=>菠萝
上述三种循环遍历数组的方法中建议大家使用foreach语句循环遍历数组,效率更高。
#4 直接改变数组的值自 PHP 5 起可以通过引用传递来做到。之前的版本需要需要采取变通的方法:
the end
领取专属 10元无门槛券
私享最新 技术干货