PHP之array数组

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

解释这些结构超出了本手册的范围,但对于每种结构至少会提供一个例子。要得到这些结构的更多信息,
建议参考有关次广阔主题的其它著作。

语法

定义数组array()

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

array( key => value
....
)

// 键(key)可以是一个整数integer 或者字符串string
// 值(value) 可以是任意类型的值

最后一个数组单元之后的逗号可以省略。通常用于单行数组定义中,例如常用 array(1,2)而不是array(1,2,).对多行
数组定义通常保留最后的一个逗号,这样要添加一个新单元时更方便。

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

php之数组的key可以是integer或者string。value可以是任意类型。

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

①、包含有合法整型值的字符串会被转换为整型。例如键名:“8” 实际会被存储为8.但是“08"则不会强制转换,
因为不是一个合法的十进制数值。

②、浮点数也会被转化为整型,意味着其小数部分会被舍去。例如键名8.7实际会被存储为8.
③、布尔值也会被转换成整型。即键名true实际会被存储为1,而键名false存储为0.
④、null 会被转换为空字符串,即键名null实际会被存储为""。
⑤、数组和对象不能被用作键名,坚持这么做会导致:illegal offset type.

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

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

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

数组解引用

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

用方括号的语法新建/修改

可以通过明示地设定其中的值来修改一个已有的数组。
这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号([])
$arr[$key] = value;
$arr[] = value;

//key 可以使integer或者string。
//value 可以是任意类型的值。

如果$arr 还不存在,将会新建一个,这也是另一种新建数组的方法。不过并不鼓励这样做。
因为如果$arr 已经包含有值,则次值会保留而[]实际上代表着字符串访问运算符。初始化变量的最好方式是直接给其赋值。

要修改某个值,通过其键名给该单元附一个新值。要删除某个键值对,对其调用unset()函数。

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

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

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

为什么$foo[bar]错了?????

应该始终在用字符串表示的数组索引上加上引号。
Note:这并不是意味着总是给键名加上引号。用不着给键名为常量或者变量的加上引号,否则会使PHP不能解析它们。

转换为数组

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

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

将null转化为array会得到一个空数组。

请注意,如果您在$ _POST数组中使用字符串作为索引,那么这些句点将转换为下划线

PHP之数组运算符

数组运算符

例子 名称 结果
$a + $b 联合 $a 和 $b的联合。
$a == $b 相等 如果$a和$b具有相同的键/值对则为true。
$a === $b 全等 如果$a和$b具有相同的键/值对并且顺序和类型相同则为true。
$a != $b 不等 如果$a不等于$b则为true。
$a <> $b 不等 如果$a不等于$b则为true。
$a !== $b 不全等 如果$a 不全等于 $b 则为true。

  • 运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。

数组中的单元如果具有相同的键名和值则比较时相等。

数组操作符 === 等于true的情况

两个数组的键值对分别相等。而且数组中的元素顺序相同。

PHP之+号运算符,加号运算符只能操作数组

例如: $c = $a + $b;
如果$a 和 $b有一个不是数组,PHP回报fatal error。

注意PHP之+号运算符,加号运算符只能操作数组
the + operator appends the right elements in the array from left,whereas duplicated keys are not overwritten
这句话的意思是如果两个元素的键名相同,保留+号运算符左边的键对应的值,而不是右边键对应的值覆盖左边键对应的值。

PHP之+号合并数组和array_merge的区别????

区别是:
①、当数组是索引数组时,array_merge()不会覆盖掉原来的值,但+号合并数组则会最先出现的值作为最终的结果返回,
而把后面的数组拥有的那些值“抛弃掉”(不是覆盖)。
②、当下标为字符时,+号任然把最先出现的值作为最结果返回,而把后面的数组拥有的相同键名的那些值“抛弃掉”,
但arra_merge()此时覆盖掉前面相同键名的值。

php 之数组的更多相关文章

  1. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)

    建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...

  4. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  5. JavaScript权威指南 - 数组

    JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...

  6. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  7. js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的

    题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...

  8. javascript数组查重方法总结

    文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 题目 对下列数组去重: var arr = ['aa', ...

  9. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

  10. 小兔JS教程(四)-- 彻底攻略JS数组

    在开始本章之前,先给出上一节的答案,参考答案地址: http://www.xiaotublog.com/demo.html?path=homework/03/index2 1.JS数组的三大特性 在J ...

随机推荐

  1. Linux install svn server

    ref: http://blog.csdn.net/pingnanlee/article/details/8812520 1. yum -y install subversion 2. svnadmi ...

  2. 物联网架构成长之路(24)-Docker练习之Compose容器编排

    0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...

  3. 如何让vue文件中的代码在Sublime Text 3中高亮和智能提示

    大家写在Sublime Text 3中编写vue文件时,会发现没有代码智能提示,清一色的黑底白字,不会像html.js一样变成彩色,给我们带来了很大的不便.所以需要安装一款叫作Vue Syntax H ...

  4. 深入研究 Runloop 与线程保活

    深入研究 Runloop 与线程保活 在讨论 runloop 相关的文章,以及分析 AFNetworking(2.x) 源码的文章中,我们经常会看到关于利用 runloop 进行线程保活的分析,但如果 ...

  5. 搭建redis集群

    官方详细介绍请移步:http://www.redis.cn/topics/cluster-tutorial.html 这里总结性给出搭建步骤: 1. 至少6个节点,三主三从 2. 编译redis源码 ...

  6. PHP更改自动加载的顺序

    composer的锅 自从PHPer们用上了composer后,对于传统的加载方式倒是不会用了,可谓是"收之东隅,失之桑榆". 下面说一下怎么改变加载顺序来覆写Laravel中的h ...

  7. 【C】——实现tree命令

    在大部分的linux系统中有一个很好用的命令——tree,就是显示目录的结构,但是发现在FreeBSD中没有这个命令,因此自己实现了一个简单的tree.代码如下:主要利用了递归的思想. #includ ...

  8. EasyRadius 动态域名DDNS设置工具,支持WayOS三代,完美解决近段时间3322和每步不稳定问题

    以下软件只适合拥有公网IP的用户哦,要是您没有公网IP,只能和我们联系,获取VPN了 EasyRadius从1.65开始就提供DDNS,中途由于我们升级了安全性,导致DDNS更新失败 这段时间由于33 ...

  9. go语言内置基础类型

    1.数值型(Number) 三种:整数型.浮点型和虚数型(有符号整数表示整数范围 -2n-1~2n-1-1:无符号整数表示整数范围 0~2n-1) go内置整型有:uint8, uint16, uin ...

  10. C# 根据类名创建类的实例对象

    因为我使用这个方法的类都是和AbstractScenePageDTO处于一个命名空间以及程序集下的,所以获取命名空间和程序集的时候,直接使用AbstractScenePageDTO这个类进行获取,这样 ...