2011-08-30 4 views
2

배열에서 json으로 변환하려고 할 때 PHP에서이 문제가 발생합니다 jSon 형식으로 인코딩 할 배열을 만드는 재귀 함수가 있습니다.JSON 문제에 대한 도움이 필요합니다

function trataArray($data) { 


$itemsByReference = array(); 

// Build array of item references: 
foreach ($data as $key => &$item) { 
    $itemsByReference[$item['id']] = &$item; 
    // Children array: 
    $itemsByReference[$item['id']]['children'] = array(); 
    // Empty data class (so that json_encode adds "data: {}") 
    $itemsByReference[$item['id']]['data'] = new StdClass(); 
} 

// Set items as children of the relevant parent item. 
foreach ($data as $key => &$item) 
    if ($item['parent_id'] && isset($itemsByReference[$item['parent_id']])) 
     $itemsByReference [$item['parent_id']]['children'][] = &$item; 

// Remove items that were added to parents elsewhere: 
foreach ($data as $key => &$item) { 
    if ($item['parent_id'] && isset($itemsByReference[$item['parent_id']])) 
     unset($data[$key]); 
} 

// Encode: 
return $data; 

} 내 JSON 그게 전부

하지만이 JSON은이 오류 :

{ 
    "0": // Problem here... T_T 
    { 
     "id": 1, 
     "parent_id": null, 
     "name": "lorem ipsum", 
     "children": [ 
      { 
       "id": 2, 
       "parent_id": 1, 
       "name": "lorem ipsum1", 
       "children": [ 
        { 
         "id": 4, 
         "parent_id": 2, 
         "name": "lorem ipsum3", 
         "children": [], 
         "data": {} 
        } 
       ], 
       "data": {} 
      }, 
      { 
       "id": 3, 
       "parent_id": 1, 
       "name": "lorem ipsum2", 
       "children": [ 
        { 
         "id": 5, 
         "parent_id": 3, 
         "name": "lorem ipsum4", 
         "children": [], 
         "data": {} 
        } 
       ], 
       "data": {} 
      } 
     ], 
     "data": {} 
    }, 
    "5": // And here... T_T 
    { 
     "id": 6, 
     "parent_id": null, 
     "name": "lorem ipsum5", 
     "children": [], 
     "data": {} 
    } 
} 

문자열 내 기능 그게 전부

$data = array(
    array('id' => 1, 'parent_id' => null, 'text' => 'lorem ipsum'), 
    array('id' => 2, 'parent_id' => 1, 'text' => 'lorem ipsum1'), 
    array('id' => 3, 'parent_id' => 1, 'text' => 'lorem ipsum2'), 
    array('id' => 4, 'parent_id' => 2, 'text' => 'lorem ipsum3'), 
    array('id' => 5, 'parent_id' => 3, 'text' => 'lorem ipsum4'), 
    array('id' => 6, 'parent_id' => null, 'text' => 'lorem ipsum5'), 
); 

: 배열의

"0": 및 "5": ca json 마크 업에서 오류를 사용합니다. 나는 그것을 preg_replace를 사용하여 제거하려고 시도했지만 정규 표현식으로 작업하는 것은 끔찍한 일이라고 생각했습니다. 누군가 그것으로 나를 도울 수 ... : D

고마워! D 그리고 내가 아이디어와 함께, 플러그인 및 ENCODE에서 JSON을 얻을 :


내가 생각을했다 ... :)

내가 테스트 할 수있는 방법을 찾고 있었다 똥 ... 돼고 그것을 하나의 배열로 만들고 JSON Encode에 올바른 것을주기 위해 무엇을 제공해야하는지 알아보기 위해 인쇄하십시오.

그들을 그가 그것을 재현 : 개체에 대한

Array 
(
    [0] => stdClass Object 
     (
      [id] => 1 
      [text] => City 
      [children] => Array 
       (
        [0] => stdClass Object 
         (
          [id] => 11 
          [text] => Wyoming 
          [children] => Array 
           (
            [0] => stdClass Object 
             (
              [id] => 111 
              [text] => Albin 
             ) 

            [1] => stdClass Object 
             (
              [id] => 112 
              [text] => Canon 
             ) 

            [2] => stdClass Object 
             (
              [id] => 113 
              [text] => Egbert 
             ) 

           ) 

         ) 

        [1] => stdClass Object 
         (
          [id] => 12 
          [text] => Washington 
          [state] => closed 
          [children] => Array 
           (
            [0] => stdClass Object 
             (
              [id] => 121 
              [text] => Bellingham 
             ) 

            [1] => stdClass Object 
             (
              [id] => 122 
              [text] => Chehalis 
             ) 

            [2] => stdClass Object 
             (
              [id] => 123 
              [text] => Ellensburg 
             ) 

            [3] => stdClass Object 
             (
              [id] => 124 
              [text] => Monroe 
             ) 

           ) 

         ) 

       ) 

     ) 

) 

json으로 그것의 기초를, 내가 그 거기에 버그를 배열 작업 및 변환 tryng IM, 데이터의 객체 생각합니다.

누군가가 그와 같은 것을 만드는 법을 알고 있습니까? ... 고마워를 생각할 수있는 난에 그냥 방법 ...

: DDD jslint.com에 따르면

+0

을 json으로 변환하는 대신 루프를 사용하여 각 반복을 json으로 변환합니다. – Ibu

+1

p.s. 'foreach()'에 대한 참조를 사용하면 매우 조심해야합니다. http://www.php.net/manual/en/control-structures.foreach.php#101425 – ken

+1

"1"과 "5"를 제거하면 JSON이 유효하지 않게됩니다. 하나의 데이터 구조를 완전히 다른 구조로 변환하는 대신 JSON 데이터 구조를 원하는 방식으로 원래의 데이터 구조를 구축하는 것이 어떻습니까? – dqhendricks

답변

1

이 유효 JSON이다. 유효성 검사기를 잘 전달합니다.

+0

문제는 js 플러그인 트리를 사용하여 "0"이 아닌 JSON 데이터를 수신해야하는 문제입니다 : "5": –

+0

예, 사용자 의견을 제외한 json이 유효합니다. 그게 무효라는 걸 어떻게 알아 냈어? 또는 오히려 어떤 문제가 원인/오류 메시지입니다. –

+0

오류를 반환하지 않고 트리를 표시하지 마십시오. 내가 "0"을 제거하면 : "5": 완벽하게 작동합니다. –

-1

문자열로 0에서 5를 정의하면 안됩니다. int로 정의해야하므로 이름을 지정하지 않아도됩니다. 이처럼 :

var $counter = 0; 
foreach ($data as $key => &$item) { 
    $itemsByReference[$counter] = &$item; 
    // Children array: 
    $itemsByReference[$counter]['children'] = array(); 
    // Empty data class (so that json_encode adds "data: {}") 
    $itemsByReference[$counter]['data'] = new StdClass(); 

    $counter++; 
} 

당신이 연관 배열을 생성하지 않는 및 인코딩 후, 그것은 당신에게 안이 방법을 "0"과 "5"와 같은 :

[ 
     { 
      // This will be 0 
     }, 
     { 
      // This will be 1, and so on 
     } 
] 
+0

전에 나는 echo json_encode ($ data)를 사용하여 그것을 출력했다; 문자열 0과 5 (나는 생각한다)는 함수에 의해서가 아니라 PHP에 의해 추가되므로 문자열이 도움이되지 않을 때 0에서 5로 설정된다. –

0

는 다음과 같이 시도 열쇠. 그것은 단지 객체들의 배열 일 것입니다.

+0

작동하지 않는다 ... 고맙지 만 여전히 0과 5를 인쇄하고있다. json에서 ... –

1

어떻게 오류가 발생 했습니까?

JSON을 <script> 블록에 직접 붙여넣고 브라우저에로드하면 IE와 Chrome 모두에서 오류가 발생하지만 변수에 동일한 JSON을 먼저 할당하면 오류 메시지가 표시되지 않습니다. Closure Compiler은 이러한 결과를 확인합니다. 맨손으로 JSON을 컴파일 할 때 실패하면 실패합니다. 간단한 변수 할당이 도입되면 모든 것이 잘 컴파일됩니다.

JS에 대한 어휘 규칙이 있는데, 이것이 영향을 미치지 않는다고 생각합니다. 슬프게도, 근본 원인이 정확히 무엇인지 모르겠습니다.

또한 정확하게 결과 JSON을 얼마나 정확하게 생성하는지 잘 모르겠습니다. 내 말은, 당신이 json_encode()을 사용하고 있다는 것을 알고 있지만, 배열 키를 가지고 무엇을해도 출력 코드 을 PHP의 배열을 사용하여 재현 할 수 없습니다. 나는이 모방 찾고 있어요

: 결과 JSON 배열 될 것이라는 점을 의미한다 PHP에서 숫자 배열 키를 사용하여, 그러나

{"0": "foo"} 

을; 내가 생각 하나 귀하의 예는 불완전/오해/잘못된, 또는 당신이있어 그래서

$x = new stdClass; 
$x->{"0"} = 'foo'; 
json_encode($x); 
> (string) {"0": "foo"} 

: 예를 들면 : 나는 당신의 JSON을 다시 만들 수 있습니다

json_encode(array(0 => 'foo')); 
> (string) ["foo"] 
json_encode(array("0" => 'foo')); 
> (string) ["foo"] 

수있는 유일한 방법은 다음을 수행하는 것입니다 PHP에서 극히 모호한 버그를 발견했습니다.

또한 JSON을 생성하지 않습니다, 다음과 같은 키에 공백 및 다른 순열을 소개 :

json_encode(array("0 " => 'foo')); 
> (string) {"0 ": "foo"} 

json_encode(array(" 0" => 'foo')); 
> (string) {" 0": "foo"} 

json_encode(array("00" => 'foo')); 
> (string) {"00": "foo"} 

json_encode(array(false => 'foo')); 
> (string) ["foo"] 

json_encode(array(null => 'foo')); 
> (string) {"": "foo"} 

json_encode(array("" => 'foo')); 
> (string) {"": "foo"} 

그래서, 무슨 일이 일어나고 있는지 확실하지.

+0

var에 속성을 지정하려고 시도하지만 PHP에서 나온 버그라고 생각하지 않습니다. @Michael이 말했듯이 JSON을 제공하는 것이 유효합니다. 나는 플러그인에서 JSON을 유효한 것으로 받아들이지 않는 것을 사용하고 있다고 생각한다. 내가 말했듯이 ID는 나에게 오류를주지 않습니다. T_T –

+0

JSON 구문 분석에 문제가 있다고 생각하지 않습니다. Internet Explorer와 Chrome의 네이티브 파서가 모두 처리하므로 괜찮습니다. 모든 공백을 제거하면됩니다. "문자열"0 "및"5 ": json 마크 업에서 오류가 발생했습니다.", 무슨 뜻입니까? ** "json 마크 업에서 오류가 발생하는 곳"은 어디입니까? ** – ken

+0

플러그인을 개발하고 개발자가 데이터를 전달하고 유형을 지정해야한다고 가정하고 JSON을 선택했습니다. 그러나 당신의 함수는 유효한 JSON, 함수 필요와 유효한 JSON, 그리고 여러분의 패턴에 해당하는 JSON을 더 필요로한다. 내 문제는 json이 유효하지만 플러그인이 패턴 및 "0": 및 "5"로 작동한다는 것입니다. 패턴을 위반하고 있습니다. 여기에 해당 플러그인과 JSON이 있습니다. http://jeasyui.com/easyui/demo/combotree.html http://jeasyui.com/easyui/demo/tree_data.json –

관련 문제