数组的key 会有如下的强制转换:
- 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
- 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。注意:字符浮点会当做字符串处理,不转为整型
- 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
- Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
- 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
- 多个同key数组,替换原则为最后一个值替换原来的值,数组顺序不会因此改变。
示例
#
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
答案
array(1) {
[1]=>
string(1) "d"
}
#因为每次都是被覆盖
示例
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
答案:
array (size=5)
'foo' => string 'bar' (length=3)
'bar' => string 'foo' (length=3)
100 => int -100
-100 => int 100
101 => int 100
如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。
示例
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
答案:
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
示例
$array = array(
"a",
"0" => "b",
"H" => "c",
"d",
);
var_dump($array);
答案:
array (size=3)
0 => string 'b' (length=1)
'H' => string 'c' (length=1)
1 => string 'd' (length=1)
# a被溢出
方括号和花括号可以互换使用来访问数组单元(例如 array{42} 在上例中效果相同)。
示例
$array = array(1, 2, 3, 4, 5);
foreach ($array as $i => $value) {
unset($array[$i]);
}
$array[] = 6;
#1
echo $array[5];
#2
echo $array[1];
$array = array_values($array);
$array[] = 7;
#3
print_r($array);
答案:
#1:5
#2:报错
#3:Array
(
[0] => 6
[1] => 7
)
如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上 1(但是最小为 0)。如果当前还没有整数索引,则键名将为 0。
注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:
array_values()重新索引数组
不建议的写法
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。
这并不意味着总是给键名加上引号。用不着给键名为常量或变量的加上引号,否则会使 PHP 不能解析它们。比如以下代码:
$key="name";
$arr=array("name"=>"zhangsan");
echo $arr[$key];
#$key 本身为字符串。所以是正确的写法。
以下写法也是正确的
<?php
function name($key)
{
return $key;
}
$arr=array("name"=>"zhangsan");
echo $arr[name("name")];
?>
重申一次,在双引号字符串中,不给索引加上引号是合法的因此$foo[bar]是合法的(“合法”的原文为 valid。在实际测试中,这么做确实可以访问数组的该元素,但是会报一个常量未定义的 notice。无论如何,强烈建议不要使用 foo['bar'] 来访问数组中元素。--haohappy 注)。至于为什么参见以上的例子和字符串中的变量解析中的解释。
php在线面试题集:http://cainiaophp.com/
php面试讨论群:536633782