2014-09-05 5 views
1

JSON 입력을 처리하는 PHP 스크립트를 만듭니다 ($ _POST 변수를 통해). JSON에서 데이터를 추출하여 SQL 데이터베이스에 업로드합니다. 나는 특정 형식으로 JSON을 원하는 :json_encode가 하나의 값을 가진 배열을 객체로 변경합니다.

$object = json_decode('{ 
    "key_a":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}], 
    "key_b":[{"value_a":10,"value_b":7}], 
    "key_c":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}] 
    }',true); 

기본적으로, 배열을 보유해야 각각의 키 객체가 (상관없이 크기가 없음). json_decode (json, true)를 사용하여 연관 배열 (객체와 반대)로 변환합니다. 각 키에 대해 많은 수표를 추가하여 개체 나 배열을 검사해야했습니다 (ASP.net 페이지에서 추출한 내용은 단일 개체가있는 개체를 배열로 변환 함). 그 (것)들을 붙 든다).

if(is_object($object["key_b"])) 
{ 
    $a = array(); 
    $a[] = $object["key"]; 
    $object["key"] = $a; 
} 

내가 그 배열을 반복 SQL 데이터베이스의 행에 값을 추가 :이 "객체이야 내가 여기서"경우 객체를 유지하는 배열을 싶습니다 점검은 다음 배열로 다시 변환 할 수 있습니다. 어떤

echo(json_encode($object)); 
// RETURNED JSON 
'{ 
     "key_a":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}], 
     "key_b":{"value_a":10,"value_b":7}, 
     "key_c":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}] 
    }' 

당신은 참조 Key_B와이 모두 잘 작동하지만로 json_encode와 JSON로 다시 변환 할 때, 오직 하나의 객체와 배열을 잡고있는 키 배열을 제거하고 해당 키에서 바로 객체를 남겨 배열이 길어 지지만 객체는 더 길다! 배열을 반복하는 자바 스크립트 스크립트를 만들어 각 객체에 하나의 DOM 요소 (div)를 추가 할 계획이므로이 작업은 정말 짜증이납니다.

왜 이런 일이 발생합니까? "? 배열에 하나의 개체 만이야 내가

"이 경우에도, 배열로 유지하는 방법이 시도 적이 있습니까 :

if(is_object($object["key_b"])) 
{ 
    $a = array(); 
    $a[] = array_values($object["key"]); 
    $object["key"] = $a; 
} 

if(is_object($object["key_b"])) 
{ 
    $a = array(); 
    $a[0] = array_values($object["key"]); 
    $object["key"] = $a; 
} 

을하지만 것 같아 이런 식으로 json_encode가 JSON에 영향을주는 것을 막을 수있는 방법은 없습니다.

이 문제를 해결하는 것이 어렵지 않지만, 키 당 하나의 검사 (배열 또는 값인지 여부 확인)를 추가하는 것을 의미합니다. 이는 데이터 추출이 실제로 커질 때 특히 시간이 많이 걸립니다.

모든 조언을 주시면 감사하겠습니다.

편집 :. JSON에서 "에 '변경 -하지만,이 난 그냥 구조를 보여주기 위해 쓴 유일한 예이다

편집 :이 아무것도 변경하는 경우 나, 아래로 내 코딩 시간을 잘라 참조를 사용 해요 ? :.

$t =& $object["key_b"]; 
if(is_object($t)) 
{ 
    $a = array(); 
    $a[] = $t; 
    $t = $a; 
} 
+0

Javascript/JSON이 "객체"라고 부르는 것과 PHP가 객체를 호출하는 것은 상당히 다릅니다. '$ object [ "key"]'는 정확히 무엇입니까? 당신의 코드가'if'에서 실행되고 있습니까? – deceze

+0

방금 ​​예제로 썼습니다. 실제로 사용한 JSON이 아닙니다. 죄송합니다. –

+0

음, 좋은 질문, 사기 - 나는 확실하지 않다! 나는 이것을 자바 스크립트 처리 객체/배열처럼 취급했다. –

답변

0

그것은 사실 반환하지 않습니다 연관 배열의 키에 is_object()를 사용하여 나타납니다 난 그냥이 예제를 노크, 이것을 증명합니다 :

$json = json_decode('{"job_details":{"a":[{"x":5},{"y":23},{"z":18}],"b":{"x":19},"c":[{"x":64},{"y":132}]}}',true); 

echo(json_encode($json)."<br><br>"); 

$t =& $json["job_details"]["b"]; 
if(is_object($t)) 
{ 
    $a = array(); 
    $a[] = $t; 
    $t = $a; 
    echo("IS OBJECT<br><br>"); 
} 

echo(json_encode($json)); 

나는 다른 방법을 찾을 것입니다 연관 배열 키 내에 어떤 값이 들어 있는지 확인하는 것.

실제로 키의 값이 연관 배열인지 아닌지 (객체가 아닌)를 찾으려고했는데, PHP에서 그 값이 다른 것을 알지 못했습니다.값이 연관 배열의 경우는 true를 반환 How to check if PHP array is associative or sequential?

:에서

function is_assoc($array) 
{ 
    return (bool)count(array_filter(array_keys($array), 'is_string')); 
} 

:

난 그냥이 사용자 정의 함수를 사용해야합니다.

+0

사실이 아닙니다. is_object는 객체를 테스트합니다. 당신은 하나가 아닌 배열 값이 발생했습니다. 모든 PHP 배열은 듀얼 모드입니다. 연관 + 순차. PHP는 상관하지 않습니다. 그러나'$ a [ 'foo'] = 새로운 StdClass; var_dump (is_object ($ a [ 'foo']))'는 true를 반환합니다. –

+0

예, json_decode()를 사용하는 경우 JSON을 객체로 변환하는 json_decode ($ string) 또는 JSON을 연관 배열로 변환하는 json_decode (string, true)로 사용할 수 있습니다. –

관련 문제