PHP 中的 array 实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型针对多种不同用途进行了优化; 它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。 由于 array 的值可以是其它 array 所以树形结构和多维 array 也是允许的。
最后一个数组单元之后的逗号可以省略。通常用于单行数组定义中,例如常用 array(1, 2)
而不是 array(1, 2, )
。对多行数组定义通常保留最后一个逗号,这样要添加一个新单元时更方便。
1.简单数组实例
"bar",
"bar" => "foo",
);
// 使用短数组语法
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
key 可以是 integer 或者 string。value 可以是任意类型。
此外 key 会有如下的强制转换:
+
号,否则将被转换为 int 类型。例如键名 "8"
实际会被储存为 8
。另外, "08"
不会被强制转换,因为它不是一个有效的十进制整数。8.7
实际会被储存为 8
。true
实际会被储存为 1
而键名 false
会被储存为 0
。null
实际会被储存为 ""
。Illegal offset type
。如果在数组定义时多个元素都使用相同键名,那么只有最后一个会被使用,其它的元素都会被覆盖。
PHP 数组可以同时含有 int 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。
2.同时含有int和string键名
"bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
?>
key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 int 键名加上 1 作为新的键名。
还可以只对某些单元指定键名而对其它的空置:
"c",
"d",
);
var_dump($array);
?>
上面这个实例输出
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
3.复杂的数组实例
'a',
'1' => 'b', // 值 "a" 会被 "b" 覆盖
1.5 => 'c', // 值 "b" 会被 "c" 覆盖
-1 => 'd',
'01' => 'e', // 由于这不是整数字符串,因此不会覆盖键名 1
'1.5' => 'f', // 由于这不是整数字符串,因此不会覆盖键名 1
true => 'g', // 值 "c" 会被 "g" 覆盖
false => 'h',
'' => 'i',
null => 'j', // 值 "i" 会被 "j" 覆盖
'k', // 值 “k” 的键名被分配为 2。这是因为之前最大的整数键是 1
2 => 'l', // 值 "k" 会被 "l" 覆盖
);
var_dump($array);
?>
上面代码会输出:
array(7) {
[1]=>
string(1) "g"
[-1]=>
string(1) "d"
["01"]=>
string(1) "e"
["1.5"]=>
string(1) "f"
[0]=>
string(1) "h"
[""]=>
string(1) "j"
[2]=>
string(1) "l"
}
注:试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致 E_NOTICE 级别错误信息,其结果为 null。