从包含数字和字符串键的关联数组中检索数据的正确方法是什么?下面的代码示例有一个奇怪的问题


What is the correct way of retrieving data from associative arrays containing both numeric and string keys? Code sample with a weird issue below

我正在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"};