isset()从作为具有任何键的数组访问的字符串变量返回true

时间:2015-01-07 19:38:11

标签: php

我遇到这样的问题:

$area="Dhaka";

isset($area); //returns true which is OK

isset($area['division']); //returns true why?

// actually, any array key of area returns true

isset($area['ANY_KEY']);//this is my question 1

isset($area['division']['zilla');//now it returns false. 

//as I know it should returns false but why previous one was true.

现在,如果我这样做:

$area['division'] = "Dhaka";
isset($area); // returns true which is OK
isset($area['division']); // returns true it's also OK
isset($area['ANY_KEY']); // returns false. I also expect this

isset($area['division']['ANY_KEY']); // returns true why? question #2

基本上我的两个问题都是一样的。

任何人都能解释一下吗?

6 个答案:

答案 0 :(得分:9)

与现有的每种编程语言一样,字符串存储为字符数组。

如果我这样做了:

$area = "Dhaka";
echo $area[0];

它将返回D

我也可以通过这样做来回显整个字符串:

echo $area[0].$area[1].$area[2].$area[3].$area[4];

PHP will also type juggle a string into 0以仅接受整数的方式传递时。

通过这样做:

echo $area['division'];

你基本上会这样做:

echo $area[0];

再次获得D

这就是isset($area['division'])返回true值的原因。

为什么不$area['foo']['bar'](又名$area[0][0])有效?因为$area只是一维数组。

当您使用可能是字符串或数组的变量时,处理此问题的最佳方法是在尝试将变量视为数组之前使用is_array()进行测试:

is_array($area) && isset($area['division'])

答案 1 :(得分:9)

PHP允许您将字符串视为数组:

$foo = 'bar';
echo $foo[1]; // outputs 'a'

所以

$area['division']

将被解析/执行为

$area[0];

(键不能是字符串,因为它不是一个数组,所以PHP类型 - 转换你的division字符串的convert-to-int规则,并给出0),并评估为达卡的D字母,显然是固定的。

答案 2 :(得分:0)

好的,这是一个解决方案,而不是解释为什么isset无法正常工作。

您想要检查数组元素是否基于它的索引字符串进行设置。这是我可能会这样做的:

function isset_by_strkey($KeyStr,$Ar)
{
    if(array_key_exists($KeyStr,$Ar))
    {
        if(strlen($Ar[$KeyStr]) > 0 || is_numeric($Ar[$KeyStr] !== FALSE)
        {
            return TRUE;
        }
        return FALSE;
    }
}

isset_by_strkey('ANY_KEY',$area); // will return false if ANY_KEY is not set in $area array and true if it is.

答案 3 :(得分:0)

在php中访问线性数组的最佳方法是

// string treated as an linear array 
$string= "roni" ;
echo $string{0} . $string{1} . $string{2} . $string{3};

// output = roni

答案 4 :(得分:-1)

这是预期的行为。

PHP Documentation covers this

您可以尝试使用empty()。

答案 5 :(得分:-1)

如果对于不存在的键返回true,则无法执行任何操作;但是,您可以确保它不会对您的代码产生负面影响。只需使用array_key_exists()然后对数组元素执行isset()。

编辑:事实上,使用array_key_exists()你甚至不需要isset如果它是行为不端只是使用strlen()之类的东西,或者如果array_key_exists返回true则检查值类型。

重点是,而不仅仅是说isset($ Ar ['something']):

if(array_key_exists('something',$Ar) )

并在必要时检查值的长度或类型。如果你需要在那之前检查数组是否存在,当然只在数组本身上使用isset()或is_array()。