I have a PHP array that has numeric keys as a string type.
But when I try and access them, PHP is giving me an undefined index error.
$a = (array)json_decode('{"1":1,"2":2}'); var_dump($a); var_dump(isset($a[1])); var_dump(isset($a["1"])); var_dump($a[1]); var_dump($a["1"]);
Output:
array (size=2) '1' => int 1 '2' => int 2 boolean false boolean false ERROR: E_NOTICE: Undefined offset: 1 null ERROR: E_NOTICE: Undefined offset: 1 null
Now the issue is “How do I access these values”?
Let’s start our environment, $obj equals the object notation of a decoded string:
php > $obj = json_decode('{"1":1,"2":2}'); php > print_r($obj); stdClass Object ( [1] => 1 [2] => 2 ) php > var_dump( $obj ); object(stdClass)#1 (2) { ["1"]=> int(1) ["2"]=> int(2) }
If you want to access the strings, we know the following will fail:
php > echo $obj->1; Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `'{'' or `'$'' in php shell code on line 1
Accessing the object variables
You can access it like so:
php > echo $obj->{1}; 1
Which is the same as saying:
php > echo $obj->{'1'}; 1
Accessing the array variables
The issue with arrays is that the following return blank, which is the issue with typecasting.
php > echo $obj[1]; php >
If you typecast it back, the object is once again accessible:
php > $obj = (object) $obj; php > echo $obj->{1}; 1
Here is a function which will automate the above for you:
function array_key($array, $key){ $obj = (object) $array; return $obj->{$key}; }
Example usage:
php > $obj = (array) $obj; php > echo array_key($obj, 1); 1 php > echo array_key($obj, 2); 2
If you want array, set the second parameter of json_decode to true.
$a = json_decode('{"1":1,"2":2}', true);
when you cast a std object to array, numeric string key doesn’t cast to number. Here is an example.
$obj = new stdClass; $obj->{'1'} = 1; $arr = (array) $obj; var_dump($arr); var_dump(isset($arr[1]));
One reply on “PHP Array with Numeric key or string type”
Neat blog! Is your theme custom made or did you download it from somewhere? A theme like yours with a few simple tweeks would really make my blog stand out. Please let me know where you got your theme. Cheers