|  | Posted by Rami Elomaa on 04/27/07 19:33 
yawnmoth kirjoitti:> <?php
 > $var['a'] = 'test';
 >
 > echo isset($var['a']['b']) ? 'true' : 'false';
 > echo '<br>';
 > echo isset($var['b']) ? 'true' : 'false';
 > ?>
 >
 > Why does that result in this output?:
 >
 > true
 > false
 >
 > It seems to me that it should instead output this:
 >
 > false
 > false
 >
 
 It has something to do with the fact that $var['a'] is a string and
 strings can be handled as an array of characters. I only assume php
 casts any non-integer offsets to integers since strings (when handled as
 an array of characters) is non-associative. Thus 'b' is cast to int,
 which is zero. var_dump($var['a']['b']) echoes 't' which is the first
 character in 'test', which supports the theory that 'b' is being casted
 to int.
 
 Also, if you use an integer instead of string:
 $var['a'] = 7;
 echo isset($var['a']['b']) ? 'true' : 'false';
 it yields false now, since an integer is not an array.
 
 > Using array_key_exists instead works, but I'm not sure why isset
 > doesn't?  Is this maybe a PHP bug?
 
 A bug or a feature? That's a tricky question. I suppose this is
 undocumented feature. The string accessing with [] is explained in the
 manual, but it does not mention the automatic casting.
 
 The workaround:
 echo (is_array($var['a']) && isset($var['a']['b'])) ? 'true' : 'false';
 
 Make sure you are dealing with an array, because the results of isset
 are ambiguous when it's a string.
 
 --
 Rami.Elomaa@gmail.com
 
 "Wikipedia on vähän niinq internetin raamattu, kukaan ei pohjimmiltaan
 usko siihen ja kukaan ei tiedä mikä pitää paikkansa." -- z00ze
  Navigation: [Reply to this message] |