2011-12-03 49 views
5

我在PHP中使用isset()函数时出现了一些奇怪的问题。 让我展示...。php isset()使用字符串作为索引的字符串变量

<?php 

$aTestArray = array(
    'index' => array(
     'index' => 'Główna' 
    ), 
    'dodaj' => 'Dodaj ogłoszenie', 
); 

var_dump(isset($aTestArray['index'])); 
var_dump(isset($aTestArray['index']['index'])); 
var_dump(isset($aTestArray['dodaj'])); 

var_dump(isset($aTestArray['index']['none'])); 
var_dump(isset($aTestArray['index']['none']['none2'])); 

// This unexpectedly returns TRUE 
var_dump(isset($aTestArray['dodaj']['none'])); 
var_dump(isset($aTestArray['dodaj']['none']['none2'])); 


?> 

后续代码var_dump的将返回:

bool(true) 
bool(true) 
bool(true) 

bool(false) 
bool(false) 
bool(true) 
bool(false) 

为什么第六的var_dump()返回TRUE?

回答

12

当在字符串上使用[]运算符时,它会期望一个整数值。如果它没有得到,它会转换它。 ['none']转换为[0],在你的情况中,它是一个D

+0

错误。 PHP的最大功能之一是它_does_允许字符串键; '['none']'是一个有效的密钥名称。 – Bojangles

+1

+1同样很好的解释,在字符串上使用'[]'会尝试以数组组件的形式访问它的字符。 –

+1

@JamWaffles绝对!但那是与关联数组一起工作的时候。在这种情况下,我们正在做一些类似'Dodajogłoszenie'['none']',它不支持命名键。 –

1

那是因为PHP是因为$ aTestArray [ 'dodaj']用C写的所以是字符串:

$aTestArray['dodaj']['none'] 

相同

$aTestArray['dodaj'][0] 

因为

var_dump((int) 'none') 

为0

+0

如果将这个答案改为汤姆答案的解释性评论,这个答案会更有用。 –