PHP中的数组实际上是一个有序映射。映射是一种把values关联到keys的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。

语法

定义数组array()

可以用array()语言结构来新建一个数组,它接受任意数量用逗号分隔的键=>值对。

键key可以是一个整数integer或字符串string

值value可以是任意类型的值

自5.4起可以使用短数组定义语法,用[]替代array()。

此外key会有如下的强制转换:

  • 包含有合法整型值的字符串会被转换为整型。例如”8“实际会被存储为8.但是”08“则不会强制转换,因为其不是一个合法的十进制数值。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。
  • 布尔值也会被转换为整型。即键名true实际会被存储为1而键名false会被存储为0。
  • Null会被转换为空字符串,即键名null实际会被储存为”“。
  • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。

如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。

PHP数组可以同时含有integer和string类型的键名,因为PHP实际并不区分索引数组和关联数组。如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。

方括号和花括号可以互换使用来访问数组单元。

自PHP5.4起可以用直接对函数或方法调用的结果进行数组解引用,在此之前只能通过一个临时变量。

自PHP5.5起可以直接对一个数组原型进行数组解引用。

Note:试图访问一个未定义的数组键名与访问任何未定义变量一样,会导致E_NOTICE级别错误信息,其结果为NULL。

Note:如果给出方括号但是没有指定键名,则取当前最大整数索引值,新的键名将是该值加上1(但是最小为0)。如果当前还没有整数索引,则键名将为0.

注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。

实用函数:

Note:unset()函数允许删除数组中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用array_values()函数。

要删除某键值对,对其调用unset()函数,重新索引array_values()函数。

当打开error_reporting来显示E_NOTICE级别的错误(将其设为E_ALL)时将看到这些错误。默认情况下error_reporting被关闭不显示这些。

Note:在双引号字符串中,不给索引加上引号是合法的因此“$foo[bar]”是合法的(“合法"的原文为valid。在实际测试中,这么做确实可以访问数组的该元素,但是会报一个常量未定义的notice。无论如何,强烈建议不要使用$foo[bar]这样的写法,而要使用$foo['bar']来访问数组中元素)。

转换为数组

对于任意integer,float,string,boolean和resource类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为0,该元素即为此标量的值。换句话说,(array)$scalarValue与array($scalarValue)完全一样。

如果一个object类型转换为array,则结果为一个数组,其单元为该对象的属性。键名将成为变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个'*'做前缀。这些前缀的前后都各有一个NULL字符。

将NULL转换为array会得到一个空的数组。

数组(Array)的赋值总是会涉及到值的拷贝。使用引用运算符通过引用来拷贝数组。

最新文章

  1. Windows下MySQL无法启动
  2. 【BO】安装BO服务器时,oracle服务端安装ora-12514和12541的问题
  3. httpclient4 文档翻译
  4. uploadify插件的功能应用
  5. table标签去除默认边框
  6. 你会在C#的类库中添加web service引用吗?
  7. linux下的基本网络配置
  8. 11g 重建EM 报ORA-20001: SYSMAN already exists
  9. window下安装composer和laravel
  10. linux tar打包
  11. [OC Foundation框架 - 23] 文件管理
  12. Apple Pay强势来袭,开发者应做的事情
  13. 当@PathVariable遇上中文和点
  14. 为什么选择使用Sass而不是Less?
  15. pat 1014 1017 排队类问题
  16. vim IDE配置
  17. STM32的优先级的理解及其使用
  18. hdu-1728(bfs+优化)
  19. 铁轨(rails, ACM/ICPC CERC 1997,Uva 514)
  20. Google Chrome中的高性能网络-[译]《转载》

热门文章

  1. Java入门与进阶P-5.1+P-5.2
  2. Unity_UIWidgets - 组件Scaffold
  3. Sqoop导出ClickHouse数据到Hive
  4. 12月22日内容总结——django中间件的三个了解要求的方法、基于django中间件的功能设计、cookie与session
  5. Vue37 常用的组件库
  6. Python装饰器实例讲解(三)
  7. STM32F4寄存器初始化:编码器
  8. 【译】.NET 7 中的性能改进(一)
  9. 山石网科HCSA学习笔记
  10. nutGet操作数据库