php 之数组

时光怂恿深爱的人放手 提交于 2019-12-22 12:51:18

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()此时覆盖掉前面相同键名的值。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!