PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。
创建数组
key 可以是 integer 或者 string。value 可以是任意类型。
key强制转换
- 包含有合法整型值的字符串会被转换为整型。例如键名 “8” 实际会被储存为 8。但是 “08” 则不会强制转换,因为其不是一个合法的十进制数值。
- 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
- 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
- Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
- 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
- 在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
// 类型强制与覆盖示例 -> 以上key都会被转换为1,值最后为d。
true => "d",
// 混合 integer 和 string 键名 ->
"foo" => "bar",
100 => -100,
-100 => 100,
//不对部分单元指定键名
"我没有键名",
"我是多维数组"=>array("a","b"),
);
$array[]="我是自动添加";
echo "<pre>";
print_r($array);
?>
访问和修改数组单元
方括号和花括号可以互换使用来访问数组单元(例如
array[42]和
array{42})。
试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致 E_NOTICE 级别错误信息,其结果为 NULL。
如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上 1(但是最小为 0)。如果当前还没有整数索引,则键名将为 0。
遍历
数组运算符
+ 联合
联合 a 和 $b 的联合。
- 运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。
<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
$c = $a + $b; // Union of $a and $b
echo "Union of \$a and \$b: \n";
var_dump($c);
$c = $b + $a; // Union of $b and $a
echo "Union of \$b and \$a: \n";
var_dump($c);
?>
//结果
Union of $a and $b:
array(3) {
["a"]=>
string(5) "apple"
["b"]=>
string(6) "banana"
["c"]=>
string(6) "cherry"
}
Union of $b and $a:
array(3) {
["a"]=>
string(4) "pear"
["b"]=>
string(10) "strawberry"
["c"]=>
string(6) "cherry"
}
== 与 === (对应!=与 !== )
== 相等 如果 数组a 和 数组b 具有相同的键/值对则为 TRUE。
=== 全等 如果 数组a 和 数组b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。
!= 不等 如果 数组a 不等于 数组b 则为 TRUE。
<> 不等 如果 数组a 不等于 数组b 则为 TRUE。
!== 不全等 如果 数组a 不全等于 数组b 则为 TRUE。
<?php
$a = array("apple", "banana");
$b = array(1 => "banana", "0" => "apple");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>
数组操作
删除
unset() 删除数组中的某个键。但要注意数组将不会重建索引.
unset()->array_values() 重建索引
<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/* will produce an array that would have been defined as
$a = array(1 => 'one', 3 => 'three');
and NOT
$a = array(1 => 'one', 2 =>'three');
*/
$b = array_values($a);
// Now $b is array(0 => 'one', 1 =>'three')
?>
排序
uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
uksort — 使用用户自定义的比较函数对数组中的键名进行排序
usort — 使用用户自定义的比较函数对数组中的值进行排序