Shaiful Islam
Shaiful Islam

Reputation: 7134

isset() returns true from a string variable accessed as an array with any key

I face a problem like this:

$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.

Now if I do this:

$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

Basically both of my questions are the same.

Can anyone explain this?

Upvotes: 8

Views: 1291

Answers (6)

Rani Das
Rani Das

Reputation: 19

The best way to access a linear array in php is

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

// output = roni

Upvotes: 0

xendi
xendi

Reputation: 2522

Okay, here's a solution rather than explaining why isset isn't going to work properly.

You want to check if an array element is set based on it's index string. Here's how I might do it:

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.

Upvotes: 0

sjagr
sjagr

Reputation: 16502

As with every programming language in existence, a string is stored as an array of characters.

If I did:

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

It would return D.

I could also echo the whole string by doing:

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

PHP will also type juggle a string into 0 when passed in a manner that accepts only integers.

So by doing:

echo $area['division'];

You would essentially be doing:

echo $area[0];

and again, getting D.

That's why isset($area['division']) returns a true value.

Why doesn't $area['foo']['bar'] (aka $area[0][0]) work? Because $area is only a single-dimension array.

The best approach to handle this problem when you're working with a variable that could either be a string or an array is to test with is_array() before trying to treat your variable as an array:

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

Upvotes: 9

xendi
xendi

Reputation: 2522

If it is returning true for keys that do not exist there's nothing you can do; however, you can make sure that it doesn't have a negative effect on your code. Just use array_key_exists() and then perform isset() on the array element.

Edit: In fact, using array_key_exists() you shouldn't even need isset if it is misbehaving just use something like strlen() or check the value type if array_key_exists returns true.

The point is, rather than just saying isset($Ar['something']) do:

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

and if necessary check the value length or type. If you need to check the array exists before that of course use isset() or is_array() on just the array itself.

Upvotes: -1

Marc B
Marc B

Reputation: 360682

PHP lets you treat a string as an array:

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

So

$area['division']

will be parsed/executed as

$area[0];

(the keys cannot be strings, since it's not REALLY an array, so PHP type-converts your division string by its convert-to-int rules, and gives 0), and evaluate to the letter D in Dhaka, which is obviously set.

Upvotes: 9

geggleto
geggleto

Reputation: 2625

It is expected behaviour.

PHP Documentation covers this

You can try empty() instead.

Upvotes: -1

Related Questions