2009-10-14 4 views
5

PHP를 사용하여 아래의 데이터를 구문 분석하는 데 어려움을 겪고 있습니다. API가 그것을 반환하고 다양한 구문을 시도했습니다. 데이터를 비 객체 방식으로 반환하려면 어떻게해야합니까? 또는 stdClass를 사용하여 데이터를 호출하는 구문은 무엇입니까?stdClass 객체 문제

하나의 데이터 기반 배열로 변환 할 수 있습니까? 객체 기반 데이터 세트에서는 실종됩니다.

stdClass Object 
(
    [0] => stdClass Object 
     (
      [district] => stdClass Object 
       (
        [state] => NY 
        [number] => 29 
       ) 

     ) 

    [1] => stdClass Object 
     (
      [district] => stdClass Object 
       (
        [state] => NY 
        [number] => 26 
       ) 

     ) 

) 

나는 위해서 var_dump을 한 후 내 자신의 객체를 생성하고,

는,이 얻을 :

object(stdClass)#8 (2) { 
    [0]=> 
    object(stdClass)#4 (1) { 
    ["district"]=> 
    object(stdClass)#5 (2) { 
     ["state"]=> 
     string(2) "NY" 
     ["number"]=> 
     string(2) "29" 
    } 
    } 
    [1]=> 
    object(stdClass)#6 (1) { 
    ["district"]=> 
    object(stdClass)#7 (2) { 
     ["state"]=> 
     string(2) "NY" 
     ["number"]=> 
     string(2) "26" 
    } 
    } 
} 
+0

이 개체는 어디에서 왔습니까? –

+0

이 API에서 http://emmense.com/sunlight-labs-php-library/ api_key = '[api 키]'; echo '

'; print_r($sf->districtsByZipCode(14485)); echo '
'; ?> – ader

답변

14

그들은 아마 자신의 코드 ($object = (object) $array)의 객체에 배열을 캐스팅. 이것은 나중에 참조로 전달 될 것이고 (객체에 대한 기본값 인 것처럼), 객체를 완전히 캐스팅 할 때까지 객체가 완전히 쓸모 없다는 단점이 있습니다 (숫자로 시작할 수 없습니다 - regex in PHP's docs 참조).) 아주 이상한 일을 할 수 :

$array = (array) $bogusObject; 
$array[0]->district->state === 'NY'; 
+0

아하! 나는'ad-text'와 같은 XML 태그를 사용하는 누군가와 비슷한 문제를 겪었습니다. SimpleXML 객체에 XML 태그를로드하고'$ ad-> ad-text'에 접근하려고 시도하지 않았습니다. – ceejayoz

+0

이 작품! 감사! – ader

+5

실제로 배열로 캐스트 할 필요가 없습니다 ... $ object -> {0} -> district ...를 사용할 수도 있습니다. – null

4

을 지금 자신의 코드를 찾고 있어요, 당신이 stdClass을 대 연관 배열 트리로 데이터를 요청하는 불행하게도, 그들은 자신의 클래스의 옵션을 노출되지했습니다 개체 트리.

은 "문제는"class.sunlightlabs.php 당신은 몇 가지 옵션이 있습니다

return json_decode($data); 

에 라인 (96)에있다.

  1. 그냥 stdClass 구문을 사용하십시오.
  2. 당신은 또한을 통해 직접 자신의 클래스와 일할 수있는 행동

    $result = toArray($result); 
    
    function toArray($data) 
    { 
        if (is_object($data)) 
        { 
        $data = get_object_vars($data); 
        } 
        return is_array($data) ? array_map(__FUNCTION__, $data) : $data; 
    } 
    

    // echo the state of the 2nd object in the result 
    echo $result->{0}->district->state; 
    

    행동에 연관 배열에 # 2 한

# 1을 반환 stdClass 트리로 변환 패턴의 창의적인 응용 프로그램이지만 서브 클래스를 많이 사용하기 때문에 상당히 복잡해 지므로이 두 가지 솔루션 중 하나를 고수 할 것입니다.

+2

json_decode ($ data)를 변경할 수 있으면; ~ json_decode ($ data, TRUE); 그런 다음 함수는 배열을 반환합니다. – null

+0

하지만 get_object_vars 제안에 대한 제안에 감사드립니다. 그러나 json_decode ($ data, TRUE) 제안은이 문제에 대한 최선의 해결책입니다. 감사! –

+0

동의. json_decode ($ data, TRUE)가 효과적이었습니다! – Suman

1

당신은이 같은 개체를 통해 반복 할 수

foreach ($obj as $each) { 
    echo $each->district->state . ' - ' . $each->district->number . '<br />'; 
} 
+0

이 작품은,하지만 정확히 내가 무엇을 찾고 있어요. 그래도 감사합니다. – ader

+0

도움이 된 것을 기쁘게 생각합니다. 나는 당신의 요구에 정확하게 부합하려고하는 것이 아니라, "stdClass를 사용하여 데이터를 호출하는 구문은 무엇입니까?"라는 질문에 대한 답변을 돕기 위해 노력했습니다. (뿐만 아니라 stdClass가 반복 가능함을 보여주기 위해). – GZipp

10

사용 : 기본적으로 당신은 다음 개체로 그 변수를 사용하여 변수에 문자열을 할당 짧은 절단있어

$object->{'0'}->district->state 

접근 자.

$zero = "0"; 
$object->$zero; /* or */ $object->{$zero}; 
+0

이것은 정말 멋진 해킹입니다. 감사합니다. @null! 내 수면을 저장;) –

0

은 soulmerge에서이 솔루션은 단지 나를 위해 잘 작동 :

$array = (array) $bogusObject; 
$array[0]->district->state === 'NY'; 

감사합니다 많이!

1

사용자 'null'은 주석에서 이것을 제안했지만 여기에 넣으므로 너무 빠르지 않습니다.

최상의 옵션 json_decode 즉 json_decode에서 두번째로 PARAM 대신 클래스의 연관 배열을 반환한다 (TRUE $ 데이터) TRUE 전달하는 것이다. 따라서 소스 코드에 액세스 할 수 있다면 변경하십시오.