PHP数组其实是一种关系映射,一种把valus关联到keys的模型。
数组的key会进行自动的强制类型转换,如下所示:
1、包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
2、浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
3、布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
4、Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
5、数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
如下代码所示:
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
输出如下:
因为上面的键名都强制转成了 “1”,每个新单位都会覆盖前一个单元,最后剩下一个 d
key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer键名加上 1 作为新的键名。
如下代码
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>
输出如下
d位于c的后面,则在原来最大的键名6 基础上加 1
重新生成索引
<?php
// 创建一个简单的数组
$array = array(1, 2, 3, 4, 5);
print_r($array);
// 现在删除其中的所有元素,但保持数组本身不变:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
$array[] = 6;
print_r($array);
// 重新索引:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>
输出如下
使用 array_values 即可实现数组的重新索引
object转成array
对于任意 integer,float,string,boolean 和 resource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValue 与 array($scalarValue) 完全一样。
如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 '*' 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为:
如下
<?php
$f = 'gg';
var_dump((array)$f);
?>
将如下显示
<?php
class A {
private $A; // This will become '\0A\0A'
}
class B extends A {
private $A; // This will become '\0B\0A'
public $AA; // This will become 'AA'
protected $C;
public $D=1;
}
var_dump((array) new B());
?>
将会如下显示
参考来源:php官方文档