2012-11-08 108 views
-2
<?php 
error_reporting(-1); 
$a = array('key' => '2'); 
$a = $a['key']; 
var_dump($a); 
echo $a['key'], "\n"; 
?> 

我希望代碼拋出空字符串或警告說不存在鍵,但代碼打印2;任何人都可以解釋這個PHP代碼?

PHP 5.3.10-1

UPDATE1:添加的var_dump和使用error_reporting。

輸出是

[email protected]:~$ php run.php 
string(1) "2" 
2 
+0

var_dump($ a)說什麼? – HappyTimeGopher

+0

你是否啓用了相應的錯誤報告? – Passerby

回答

6

$a是保持值"2"的字符串。

PHP中的字符串可以使用方括號進行索引以訪問它們的字符。例如:

$a = "abcde"; 
echo $a[3]; // This will print 'd' 

當索引是字符串時,PHP會嘗試將其解析爲整數。如果字符串不是數字,解析將給出0。因此,使用表示第一個字符的第零個索引。 (在PHP 5.4及更高版本中,它會發出警告)。在你的情況,你有「2」,因爲$a['any_stuff'] =第一個字符= '2'

PHP manual:由字符

字符串訪問和修改字符串中的

字符可能被訪問和修改在使用 方形陣列括號的字符串之後指定 期望字符的從零開始的偏移量,如$str[42]中所示。將字符串想象爲用於此目的的字符數組 。可以使用功能substr()substr_replace()當您要提取或替換更多的 比1個字符。

從PHP 5.4開始,字符串偏移必須是整數或類似整數的字符串,否則會引發警告。

+0

它是否提及任何地方當索引不是數字時,它假定第零個索引(第一個字符)? – sp2hari

+1

哇! +1新信息! :)但它不會拋出一個錯誤,說沒有這樣的'索引'? –

+0

優秀的答案。如果你的數組值不是單個字符,它實際上會更清晰。使用'key'=>'cabbages',輸出爲'c'和'cabbages':http://ideone.com/QkhaMp –

1

這使得更多的意義,如果你挑選$a['key']不同的值。

$a = array('key' => 'whatever'); 
$a = $a['key']; 
var_dump($a); 
echo $a['key'], "\n"; 

輸出是:

string(8) "whatever" 
w 

首先echo命令不是一個真正的函數,而是語言結構。括號是可選的。其次,當你有一個字符串可以作爲一個數組訪問時,PHP會將該字符串視爲一個字符數組。但是,如果你傳遞一個無效的密鑰,那麼你會得到第一個字符。

echo $a[0]; // w 
echo $a[1]; // h 
echo $a[2]; // a 
echo $a[3]; // t 
echo $a['invalid_key']; // w 
相關問題