(006)系统学习PHP之数组

什么是数组?

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

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180218G0MZTP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券