Edit report at http://bugs.php.net/bug.php?id=53130&edit=1
ID: 53130 Updated by: [email protected] Reported by: manchokapitancho at gmail dot com Summary: JSON decoded arrays have broken integer keys Status: Bogus Type: Bug Package: JSON related PHP Version: 5.3.3 Block user comment: N New Comment: You're right, I missed the cast. My apologies. Having said that, casting an object with integer keys to an array results in the integer keys being inaccessible -- this is documented in the manual at http://php.net/language.types.array#language.types.array.casting Access the object as an object and you won't have a problem. Previous Comments: ------------------------------------------------------------------------ [2010-10-22 09:20:43] manchokapitancho at gmail dot com Additionaly, it's not about whether the numeric keys of an object could be access but about that json decoded object converted to array appears (var_dump) to have the numeric keys but they are not accessible. That is an incostistency no matter what the usages of this code are. ------------------------------------------------------------------------ [2010-10-22 09:14:34] manchokapitancho at gmail dot com A.Harvey, it seems that you haven't read the bug carefully enough and set it to bogus incorrectly. Please check this code: $old_array = array (3 => 4, 'test' => 5); $obj = json_decode (json_encode ($old_array)); $new_array = (array)$obj; var_dump ($old_array); //outputs:array(2) { [3]=> int(4) ["test"]=> int(5) } var_dump ($new_array); //outputs:array(2) { [3]=> int(4) ["test"]=> int(5) } var_dump (array_key_exists (3, $old_array)); //outputs:bool(true) var_dump (array_key_exists (3, $new_array)); //outputs:bool(false) !!! var_dump ($old_array[3]); //outputs:int(4) var_dump ($new_array[3]); //outputs:NULL !!! The bug is obvious! ------------------------------------------------------------------------ [2010-10-22 09:01:59] [email protected] Besides being invalid JSON, that's an object rather than an array. Object property names generally follow the same rules as variable names, but can be accessed via braced literals like so: <?php $obj = json_decode ('{ "3" : "4", "text" : "5" }'); var_dump($obj->{3}); // outputs string(1) "4" var_dump($obj->{'3'}); // outputs string(1) "4" ?> Not a bug; closing. ------------------------------------------------------------------------ [2010-10-21 14:50:03] manchokapitancho at gmail dot com Description: ------------ JSON decoded arrays have their integer keys broken. They are present in the array but they can be neither accessed nor found through array_key_exists. Test script: --------------- $obj = json_decode ('{ "3" : "4", "text" : "5" }'); var_dump ($obj); $arr = (array)$obj; var_dump ($arr); var_dump ($arr[3]); var_dump ($arr["text"]); var_dump (array_key_exists (3, $arr)); var_dump (array_key_exists ("text", $arr)); Expected result: ---------------- object(stdClass)#10 (2) { ["3"]=> string(1) "4" ["text"]=> string(1) "5" } array(2) { ["3"]=> string(1) "4" ["text"]=> string(1) "5" } string(1) "4" string(1) "5" bool(true) bool(true) Actual result: -------------- object(stdClass)#10 (2) { ["3"]=> string(1) "4" ["text"]=> string(1) "5" } array(2) { ["3"]=> string(1) "4" ["text"]=> string(1) "5" } NULL string(1) "5" bool(false) bool(true) ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=53130&edit=1
