# Array 数组
## 数组函数列表及说明
http://www.w3school.com.cn/php/php_ref_array.asp
## 官方的描述
>PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。
## 数组的介绍
* 数组分为 **索引数组** 和 **关联数组**(也叫键值对数组)。
* 数组通常由任意数量的 **键(key)** 和 **值(value)** 组成。
* 以纯数字作为键的数组,我们叫索引数组,此外的数组都可以叫关联数组。
* 键值之间使用 `=>`(大于等于符号)隔开。
* 每一对键值之间用`,`(逗号)隔开,最后一个子元素之后的逗号可以省略,但关联数组最后的逗号建议保留。
* 定义数组时键(key)可以不用输入,也可以只给其中部分值设置键,系统自动给没有键的值加上以从零开始的数字键。
* 数组的键建议使用`integer`或`string`类型,值可以是任意类型。
* 数组可以同时含有`integer`和`string`类型的键,因为PHP实际上并不区分索引数组和关联数组。
* 在对数组进行赋值的时候,如果不指定键,则取当前数组中最大数字索引加一作为键,哪怕数组中当前都是以`string`类型作为键的关联数组。
* 如果一个函数返回的是一个数组,那么在调用函数时可以直接在函数后面加上中括号和索引号来获取返回的值,例如`getName()[1]`。
* 取值时,如果提供的键并未定义,那么返回的结果是`null`。
* 以字符串作为键,在定义或取值的时候,需要给字符串加上引号作为索引,例如`$array["key"]`,如果不加,就会报错,但是程序其实是可以运行的,例如`$array[key]`,这时系统会以为`key`是常量,然后去找,结果没有这个常量,系统就主动给key加上了双引号。
* 数组的键可以是一个函数,例如`$array[getKey()]`,如果该函数并没有返回值,那么此时的键将会是空。
## 键的强制转换
> 使用下列方式中的类型数据作为数组的键将会被系统强制进行类型转换
* 合法的整数型字符串会被强制转换成整形,例如`"8"`实际上会被当做`8`,但"08"则不会。
* 浮点数也会被转换成整数型,其小数部分会被省去,例如`2.6`实际上会被当做`2`。
* 布尔值会被转换成整数型,`true`为`1`,`false`为`0`。
* null会被转成空字符串。
* 数组和对象不能用作key,否则会无效且有警告。
* 数组key的强制转换例子
~~~
<?php
// 定义数组
$array = [
8 => "a",
"3" => "b",
13.6 => "c",
true=> "d"
];
// 打印数组的结构
print_r($array);
// 此时在浏览器里可以看到数组内容为
// Array ( [8] => a [3] => b [13] => c [1] => d )
?>
~~~
## 数组的强制转换
* 大多数常见类型(除了object之外),如果将其转换为数组,例如`(array) $var`得到的结果将是只有一个元素且索引为0的数组,实际上如同于`array($var)`。
* 将object对象转换为array时,系统会以object对象的属性变量名作为键,属性的内容作为值,其中私有属性前面会加上类名作为前缀,保护属性前面会加上`*`作为前缀,而这些前缀前后各有一个`null`字符,有点麻烦,所以不建议这么转换。
## 数组的简单应用
* 数组的定义
~~~
<?php
// 通过array()函数定义
$array = array(1, 3.5, true, "four");
// 通过[]定义(需要PHP5.4或以上)
$array = array[1, 3.5, true, "four"];
// 定义空数组
$array = [];
// 未赋值变量定义数组
$array_one[] = "xixi";
// 未赋值变量定义数组2
$array_two[2] = "haha";
?>
~~~
* 数组的赋值
~~~
<?php
// 定义一个数组
$array = [
"a" => 2016,
"b" => "04",
"c" => "18",
];
// 添加一个值
$array[] = "xixi";
// 再添加一个值
$array[2] = "haha";
// 修改一个值
$array[2] = "haha";
?>
~~~
* 数组的获取和删除
~~~
<?php
// 定义一个数组
$array = [
"a" => 2016,
"b" => "04",
"c" => "18",
"d" => [
"h" => 10,
"i" => 35,
"s" => 20,
],
];
// 获取一个值
echo $array["a"];
// 再获取一个值
echo $array["d"]["h"];
// 删除一个值
unset($array["d"]["s"]);
// 再删除一个值
unset($array["d"]);
?>
~~~