2013-03-07 3 views
0

나는 json_encode를 통과하는 배열을 가지고 있는데, 첫 번째 배열 주위에 배열 대괄호를 래핑하지만 두 번째 배열 주위로 객체 인클로저 {}를 래핑하고 중첩 배열의 번호를 매긴다. 어떤 오류도 발생시키지 않고 왜 이것이 발생했는지 궁금해졌습니다.json encode query

{ 
"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 
             ) 

           ) 

         ) 
       ) 
     ) 
) 

답변

3

제는 associative array 때문에

는 (그와 같은 키 문자열을 갖는다). JS 배열에는 숫자 인덱스 만있을 수 있습니다. 그것은 표준 숫자 배열과 같은 있도록

PHP 5.3로, 당신은 단지 JSON_FORCE_OBJECT

0
당신의 first_array 정말 인덱스 = 0에서 시작하는 배열입니다 연속이기 때문에 second_array 인덱스에서 시작하는 반면 그것은 발생할 수 있습니다

= 2이므로 함수는 인덱스 (문자열) < => 값 연결을 사용합니다. B.

0

첫 번째로 출력 객체에 json_encode 강제 할 수는 키 0에서 시작한다. ie first[0] 자바 스크립트에서 첫 번째 요소를 제공합니다.

두 번째 것은 2에서 시작합니다. 표준 자바 스크립트 배열에 넣을 수 없습니다. PHP에서 $ second [2]는 자바 스크립트에서 second[0]이 될 것입니다 (배열로 변환 한 경우).

두 개의 번호 시스템은 호환되지 않습니다. 객체로 저장하면 데이터에 임의의 문자열 키가 허용됩니다.

당신은 현재의 키를 폐기

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

를 호출 할 수있다 - (A associtative 배열 같은 더.도 오히려 숫자 배열에 비해 키, 같은 번호를 가진 자바 스크립트 숫자 배열 키를 건너 뛸 수 없습니다) 두 번째 배열 및 새 키 가져 오기 - 0에서 시작하여 변환 될 때 일반 자바 스크립트 배열을 형성합니다.

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에서 간단한 객체처럼 rappresented됩니다.