我正在php中开发一个小模块,该模块接受包含json编码的stdObjects数组的字符串,对其进行解码,将其对象转换为关联数组并迭代结果。
这是一个简单的过程,但我遇到了一个非常奇怪的问题,即使是php标准。由于某些原因,我无法读取索引大于9的值。我假定这些索引一定存在类型问题,但我显然排除了这种可能性,如下面的代码所示:
$str = '{
"2014": {
"13": 0.03,
"01": 0.03
},
"2013": {
"13": 0.154,
"12": 0.029,
"11": 0.03,
"10": 0.014,
"09": 0.015,
"08": 0.012,
"07": 0.034,
"06": 0.02,
"05": 0,
"04": 0,
"03": 0,
"02": 0,
"01": 0
},
"2012": {
"13": 0,
"12": 0,
"11": 0,
"10": 0,
"09": 0,
"08": 0,
"07": 0,
"06": 0,
"05": 0,
"04": 0,
"03": 0,
"02": 0,
"01": 0
},
"2011": {
"13": 0,
"12": 0,
"11": 0,
"10": 0,
"09": 0,
"08": 0
}
}';
$variacion_mensual = json_decode( $str );
foreach( $variacion_mensual as &$var ){
$var = (array) $var;
echo 'Index as string: '."'t";
var_dump( $var["13"] ); // Returns null
var_dump( $var["10"] ); // So does this index
echo 'Index as int: '."'t"."'t" ;
var_dump( $var[13] ); // Returns null
var_dump( $var[10] ); // So does this index
}
var_dump($variacion_mensual);
一个奇怪的问题应该有一个同样奇怪的解决方案:用php打败php,所以我尝试了这个并成功了:
foreach( $variacion_mensual as &$var ){
$var = (array) $var; // Cast each object as stdObject
// These two lines will do the trick
$var = serialize($var);
$var = unserialize($var);
// These two lines did the trick
echo 'Index as string: '."'t";
var_dump( $var["13"] ); // Returns the correct strings containing the float info
echo 'Index as int: '."'t"."'t" ;
var_dump( $var[13] ); // Returns the correct strings containing the float info
}
有谁能推测一下这种行为吗?提前感谢你的时间和耐心,我真的知道这是一些由一个错误,几乎不可能解决的凡人。
使用说明:
json_decode($str, true);
重点是,stdClass
对象不实现ArrayAccess
,所以你不使用它们作为数组。
或
如果你想使用它们作为对象,试着访问:
$var->{"13"};