2013-03-07 18 views
0

我有一个数组,我通过json_encode,它围绕第一个数组包围数组括号,但围绕第二个数组包围对象包围并编号嵌套数组。它不会造成任何错误,只是想知道为什么会发生这种情况。json编码查询

{ 
"data": { 
    "first_array": [ 
     { 
      "meta": { 
       "slug": "rank", 
       "weight": "100", 
       "description": "lorem ipsum", 
       "importance": { 
        "value": 2, 
        "max": 5 
       } 
      }, 
      "scores": { 
       "results": { 
        "slug": "rank", 
        "type": "int", 
        "value": "4" 
       } 
      } 
     }, 
     { 
      "meta": { 
       "slug": "rank", 
       "weight": "100", 
       "description": "lorem ipsum", 
       "importance": { 
        "value": 2, 
        "max": 5 
       } 
      }, 
      "scores": { 
       "results": { 
        "slug": "rank", 
        "type": "int", 
        "value": "4" 
       } 
      } 
     } 
    ], 
    "second_array": { 
     "2": { 
      "meta": { 
       "slug": "this", 
       "weight": "75", 
       "description": "lorem ipsum", 
       "importance": { 
        "value": 1, 
        "max": 5 
       } 
      }, 
      "scores": { 
       "results": { 
        "slug": "this", 
        "type": "boolean", 
        "value": 1, 
        "code": 200 
       } 
      } 
     }, 
     "3": { 
      "meta": { 
       "slug": "that", 
       "weight": "200", 
       "description": "lorem ipsum", 
       "importance": { 
        "value": 3, 
        "max": 5 
       } 
      }, 
      "scores": { 
       "results": { 
        "slug": "that", 
        "type": "boolean", 
        "value": 1 
       } 
      } 
     } 
    } 
} 

}

这里是阵列的print_r的

Array 
(
    [data] => Array 
     (
      [first_array] => Array 
       (
        [0] => Array 
         (
          [meta] => Array 
           (
            [slug] => rank 
            [weight] => 100 
            [description] => lorem ipsum 
            [importance] => Array 
             (
              [value] => 2 
              [max] => 5 
             ) 

           ) 

          [scores] => Array 
           (
            [results] => Array 
             (
              [slug] => rank 
              [type] => int 
              [value] => 4 
             ) 

           ) 

         ) 
        [1] => Array 
         (
          [meta] => Array 
           (
            [slug] => rank 
            [weight] => 100 
            [description] => lorem ipsum 
            [importance] => Array 
             (
              [value] => 2 
              [max] => 5 
             ) 

           ) 

          [scores] => Array 
           (
            [results] => Array 
             (
              [slug] => rank 
              [type] => int 
              [value] => 4 
             ) 

           ) 

         ) 

       ) 

      [second_array] => Array 
       (
        [2] => Array 
         (
          [meta] => Array 
           (
            [slug] => this 
            [weight] => 100 
            [description] => lorem ipsum 
            [importance] => Array 
             (
              [value] => 2 
              [max] => 5 
             ) 

           ) 

          [scores] => Array 
           (
            [results] => Array 
             (
              [slug] => this 
              [type] => boolean 
              [value] => 1 
              [code] => 200 
             ) 

           ) 

         ) 
        [3] => Array 
         (
          [meta] => Array 
           (
            [slug] => that 
            [weight] => 100 
            [description] => lorem ipsum 
            [importance] => Array 
             (
              [value] => 2 
              [max] => 5 
             ) 

           ) 

          [scores] => Array 
           (
            [results] => Array 
             (
              [slug] => that 
              [type] => boolean 
              [value] => 1 
             ) 

           ) 

         ) 
       ) 
     ) 
) 

回答

0

可能发生,因为你的first_array是真的开始在指数= 0的数组,并是连续的,而second_array开始于指数= 2,所以函数使用索引(作为字符串)< =>值关联。

B.

0

第一个开始于0键,所以它看起来像一个标准的数字阵列。即在javascript中first[0]会给你第一个元素。

但第二个从2开始,不能被放入一个标准的JavaScript数组。即PHP中的$ second [2]将在JavaScript中实际为second[0](如果它确实将其转换为数组)。

这两个数字系统不兼容。作为对象保存,允许数据上的任意字符串键。 (更像是一个associtative阵列 - 即使数字作为键,而不是一个数值数组一个JavaScript数值数组不能跳过键)

你可以称之为

$array['data']['second_array'] = array_values($array['data']['second_array']); 

丢弃的当前键第二个数组,并获得新的键 - 它将从0开始,并在转换时形成一个正常的javascript数组。

0

为重现你的状态(并试图解释它)只是一个例子

$a = Array("a","b","c","d"); 
echo json_encode($a); // ["a","b","c","d"] 
unset($a[2]); 
echo json_encode($a); // {"0":"a","1":"b","3":"d"} 

在第一种情况下,我们有一个纯粹的阵列(数字)。所以这个json字符串是一个数组rappresentation ["a","b","c","d"]

但是,当我们取消设置第三个元素时,数字数组将会是关联数组(因为顺序尚未被尊重)。关联数组(带有数字索引但不是顺序索引)在json中像简单对象一样被提交。