數(shù)組的key 會有如下的強制轉換:
- 包含有合法整型值的字符串會被轉換為整型。例如鍵名 "8" 實際會被儲存為 8厂汗。但是 "08" 則不會強制轉換委粉,因為其不是一個合法的十進制數(shù)值。
- 浮點數(shù)也會被轉換為整型面徽,意味著其小數(shù)部分會被舍去艳丛。例如鍵名 8.7 實際會被儲存為 8匣掸。注意:字符浮點會當做字符串處理趟紊,不轉為整型
- 布爾值也會被轉換成整型。即鍵名 true 實際會被儲存為 1 而鍵名 false 會被儲存為 0碰酝。
- Null 會被轉換為空字符串霎匈,即鍵名 null 實際會被儲存為 ""。
- 數(shù)組和對象不能被用為鍵名送爸。堅持這么做會導致警告:Illegal offset type铛嘱。
- 多個同key數(shù)組暖释,替換原則為最后一個值替換原來的值,數(shù)組順序不會因此改變墨吓。
示例
#
$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
如果對給出的值沒有指定鍵名球匕,則取當前最大的整數(shù)索引值,而新的鍵名將是該值加一帖烘。如果指定的鍵名已經有了值亮曹,則該值會被覆蓋。
示例
$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被溢出
方括號和花括號可以互換使用來訪問數(shù)組單元(例如
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
)
如上所述照卦,如果給出方括號但沒有指定鍵名,則取當前最大整數(shù)索引值乡摹,新的鍵名將是該值加上 1(但是最小為 0)役耕。如果當前還沒有整數(shù)索引,則鍵名將為 0聪廉。
注意這里所使用的最大整數(shù)鍵名不一定當前就在數(shù)組中瞬痘。它只要在上次數(shù)組重新生成索引后曾經存在過就行了。以下面的例子來說明:
array_values()重新索引數(shù)組
不建議的寫法
<?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孝赫。在實際測試中较木,這么做確實可以訪問數(shù)組的該元素,但是會報一個常量未定義的 notice青柄。無論如何伐债,強烈建議不要使用
foo['bar'] 來訪問數(shù)組中元素。--haohappy 注)峰锁。至于為什么參見以上的例子和字符串中的變量解析中的解釋萎馅。
php在線面試題集:http://cainiaophp.com/
php面試討論群:536633782