PHP 中的 array 实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型针对多种不同用途进行了优化; 它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。 由于 array 的值可以是其它 array 所以树形结构和多维 array 也是允许的。
解释这些数据结构超出了本手册的范围,但对每种结构至少会提供一个例子。 要得到这些数据结构的更多信息,建议参考有关此广阔主题的其它文献。
可以用 语言结构来新建一个 array。它接受任意数量用逗号分隔的 键(key) => 值(value)
对。
最后一个数组单元之后的逗号可以省略。通常用于单行数组定义中,例如常用array(1, 2)
而不是array(1, 2, )
。对多行数组定义通常保留最后一个逗号,这样要添加一个新单元时更方便。
示例 #1 一个简单数组
此外 key 会有如下的强制转换:
+
号,否则将被转换为 int 类型。例如键名 "8"
实际会被储存为 8
。另外, "08"
不会被强制转换,因为它不是一个有效的十进制整数。
8.7
实际会被储存为 8
。
null
实际会被储存为 ""
。
如果在数组定义时多个元素都使用相同键名,那么只有最后一个会被使用,其它的元素都会被覆盖。
示例 #2 类型转换与覆盖的示例
上例中所有的键名都被强制转换为 1
,则每一个新单元都会覆盖前一个的值,最后剩下的只有一个 "d"
。
PHP 数组可以同时含有 int 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。
key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 int 键名加上 1 作为新的键名。
示例 #4 没有键名的索引数组
还可以只对某些单元指定键名而对其它的空置:
示例 #5 仅对部分单元指定键名
可以看到最后一个值 "d"
被自动赋予了键名 7
。这是由于之前最大的整数键名是 6
。
示例 #6 复杂类型转换和覆盖的例子
这个例子包括键名类型转换和元素覆盖的所有变化。
数组单元可以通过 array[key]
语法来访问。
示例 #7 访问数组单元
示例 #8 数组解引用
试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致
E_NOTICE
级别错误信息,其结果为null
。
可以通过明示地设定其中的值来修改现有的 array 。
这是通过在方括号内指定键名来给 array 赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号([]
)。
如果 $arr 不存在或者设置为null
或者false
,将会新建它,这也是另一种创建 array 的方法。不过并不鼓励这样做,因为如果 $arr 已经包含有值(例如来自请求变量的 string)则此值会保留而[]
实际上代表着。初始化变量的最好方式是直接给其赋值。
注意: 从 PHP 7.1.0 起,对字符串应用空索引操作符会抛出致命错误。以前,字符串被静默地转换为数组。
注意: 从 PHP 8.1.0 起,弃用从
false
值中创建一个新数组。 但仍然允许从null
或者未定义的变量中创建新数组。
要修改某个值,通过其键名给该单元赋一个新值。要删除某键值对,对其调用 函数。
如上所述,如果给出方括号但没有指定键名,则取当前最大 int 索引值,新的键名将是该值加上 1(但是最小为 0)。如果当前还没有 int 索引,则键名将为
0
。注意这里所使用的最大整数键名目前不需要存在于 array 中。 它只要在上次 array 重新生成索引后曾经存在于 array 就行了。以下面的例子来说明:
有很多操作数组的函数,参见 一节。
函数允许删除 array 中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 函数重建 array 索引。
控制结构是专门用于 array的。它提供了一个简单的方法来遍历 array。
应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar']
而不是 $foo[bar]
。但是为什么呢?可能在老的脚本中见过如下语法:
这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量( bar
)而不是 string('bar'
-注意引号)。而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的
string 且不对应于任何已知符号)转换成一个其值为该裸 string 的 string。例如,如果没有常量定义为 bar
,那么PHP 将在 string 中替代为 'bar'
将未定义的常量当作裸字符串的回退会触发 E_NOTICE
级别错误。 从 PHP 7.2.0 起已废弃,并触发 E_WARNING
级别错误。 从 PHP 8.0.0 起被移除,并触发 异常。
注意: 这并不意味着总是给键名加上引号。用不着给键名为 或 的加上引号,否则会使 PHP 不能解析它们。
演示此行为的更多例子:
// 以下是可以的,因为它在字符串中。
// 有一个例外:字符串中花括号围绕的数组中常量可以被解释
当打开 来显示
E_NOTICE
级别的错误(将其设为 E_ALL
)时将看到这些错误。默认情况下
和在 一节中规定的一样,在方括号([
” 和 “]
”)之间必须有一个表达式。这意味着可以这样写:
这是一个用函数返回值作为数组索引的例子。PHP 也可以用已知常量,可能之前已经见过:
注意 E_ERROR
也是个合法的标识符,就和第一个例子中的 bar
一样。但是上一个例子实际上和如下写法是一样的:
也许有一天,PHP 开发小组可能会想新增一个常量或者关键字,或者用户可能希望以后在自己的程序中引入新的常量,那就有麻烦了。例如已经不能这样用 empty
和 default
这两个词了,因为他们是 。
注意: 重申一次,在双引号字符串中,不给索引加上引号是合法的因此
"$foo[bar]"
是合法的(“合法”的原文为 valid。在实际测试中,这么做确实可以访问数组的该元素,但是会报一个常量未定义的 notice。无论如何,强烈建议不要使用 $foo[bar]这样的写法,而要使用 $foo['bar'] 来访问数组中元素。--haohappy 注)。至于为什么参见以上的例子和 中的解释。
对于任意 int,float, string,bool 和 resource 类型,如果将一个值转换为 array,将得到一个仅有一个元素的数组,其下标为
如果将 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问; 私有变量前会加上类名作前缀;保护变量前会加上一个 '*' 做前缀。这些前缀的前后都各有一个 NUL
字节。 未初始化的将会被丢弃。
这些 NUL
会导致一些意想不到的行为:
上例会有两个键名为 'AA',不过其中一个实际上是 '\0A\0A'。
将 null
转换为 array 会得到一个空的数组。
在 array 定义时,用 ...
前缀的一个 array 可以被展开到当前位置。 只有实现了 的数组和对象才能被展开。 PHP 7.4.0 开始可以使用 ...
解包 array。
它可以多次使用,在 ...
操作符前后都可以添加常规元素:
示例 #9 简单的数组解包
...
操作符解包 array 时也遵守函数 的语义。 也就是说,key 为字符时,后面的字符键会覆盖之前的字符键;key 为 integer 时则会重新编号:
PHP 中的数组类型有非常多的用途。以下是一些示例:
可以通过引用传递 array 的值来直接更改数组的值。
示例 #13 在循环中改变单元
本例生成一个下标从 1 开始的数组。
示例 #14 下标从 1 开始的数组
示例 #15 填充数组
Array 是有序的。也可以使用不同的排序函数来改变顺序。更多信息参见 。可以用 函数来统计出 array 中元素的个数。
示例 #16 数组排序
因为 array 中的值可以为任意值,也可是另一个 array。这样可以产生递归或多维 array。
示例 #17 递归和多维数组
// 创建一个新的多维数组
Array 的赋值总是会涉及到值的拷贝。使用 通过引用来拷贝 array。
了解数组的声明方法,及其分类和构造掌握数组的输出和遍历方法掌握与数组常用操作相关的函数的应用了解PHP预定义数组 初识数组","JSP") );print_r ($str) ; //输出数组?>数组的构造6.1.3运行结果如图6-2所示。提 示二维数组也叫多维数组,是指包含一个或多个数组的数组。图6-2 二维数组 数组的输出.2数组的遍历数组的输出和遍历6.2数组的声明6.2.1在PHP中,要对数组某一元素进行输出,通常使用echo和print语句;要将数组结构输出,可以通过print_r()函数来实现。其语法格式如下:bool print_r(mixed $expression)如果该函数的参数expression为普通的字符型、整型或实型变量,则直接输出该变量;如果该参数为数组,则按键值和元素的顺序输出数组中的所有元素,如例6-2中便使用该函数输出了数组。数组的遍历6.2.2数组主要是对多个相互关联的数据进行批量处理,一般是对整个数组进行统一管理,很少直接访问数组中的单个成员。对数组进行遍历的方法有很多,下面分别介绍。使用foreach()循环遍历数组1foreach()是用
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。