2009-10-14 11 views
5

PHP kullanarak aşağıdaki verileri ayrıştırmak için uğraşıyorum. Bir API onu döndürür ve çeşitli sözdizimlerini denedim. Verileri nesnel olmayan bir şekilde nasıl iade ederim? Veya, stdClass kullanarak verileri çağırmak için sözdizimi nedir?stdClass Nesnesi sorunları

Bunu bir veri tabanlı diziye dönüştürebilir miyim, hatta iki? Nesne tabanlı veri kümeleri olduğunda kayboluyorum.

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

     ) 

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

     ) 

) 

i var_dump yapmak sonra başıma nesne oluşturmak ve

, bu alın:

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

Bu nesne nereden geliyor? –

+0

Bu API'den, http://emmense.com/sunlight-labs-php-library/ api_key = '[api key]'; echo '

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

cevap

14

Muhtemelen kendi kodu ($object = (object) $array) nesnelere diziler döküm vardır. Bu, şu andan itibaren referans olarak geçirileceği (nesnelerle varsayılan olarak olduğu gibi) ve dezavantajın nesnenin tamamen işe yaramaz hale gelmesinden (üyeler sayılarla başlayamaz - bkz. regex in PHP's docs) geri dönene kadar (PHP yapar) bazı çok gizemli şeyler izin:

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

Ah ha! Bir keresinde 'ad-text' gibi XML etiketlerini kullanan bir SimpleXML nesnesine yükleme yapmak ve '$ ad-> ad-text' işlevine erişmeye çalışmakla benzer bir sorunla karşılaştım. – ceejayoz

+0

Bu işe yarıyor! Teşekkürler! – ader

+5

Bir diziye dökülmeye gerek yok ... $ object -> {0} -> bölge ... 'yi de kullanabilir. – null

4

Ben şimdi onların koduna bakıyorum ve bir stdClass vs bir ilişkisel dizi ağacı gibi veri istemek için maalesef onların sınıfında seçeneği maruz kalmaz ettik nesne ağacı

"Sorun" class.sunlightlabs.php Bir kaç seçenek var

return json_decode($data); 

satır 96 altındadır.

  1. Sadece stdClass sözdizimini kullanın.
  2. Ayrıca üzerinden doğrudan sınıflarıyla işe yarayabilir eylem

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

    yılında

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

    eylem bir ilişkisel dizi haline 2. bir

1. döndürdü stdClass ağacı dönüştürün desenlerin yaratıcı bir şekilde uygulanması, ama zaten oldukça karmaşık hale getiren sublcasses ağır kullanımı, bu yüzden bu iki çözümden birine sadık.

+2

json_decode ($ data) değiştirebilirseniz; json_decode'a ($ data, TRUE); Daha sonra işlev bir dizi döndürür. – null

+0

işe yarayan get_object_vars öneri için teşekkürler, ancak json_decode ($ data, TRUE) öneri, bu sorun için en iyi düzeltmedir. Teşekkürler! –

+0

Anlaşıldı. json_decode ($ data, TRUE) harika çalıştı! – Suman

1

Böyle nesnesini yineleyebilirsiniz:

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

Bu çalışır, ama tam olarak aradığım şey değil. Yine de teşekkürler. – ader

+0

Yardım ettiğine sevindim. Gereksinimlerinize tam olarak uymaya çalışmıyorum, ancak sorunuzu cevaplamaya yardımcı olmak için, "stdClass kullanarak verileri çağırmanın sözdizimi nedir?" (stdClass'ın yinelenebilir olduğunu göstermek için). – GZipp

10

Kullanım: Temelde Ardından nesne olarak bu değişkeni kullanarak, bir değişkene bir dize atayarak kısa kesme konum

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

erişimci.

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

Bu gerçekten harika bir hack, teşekkürler @null! Benim uyku kaydedildi;) –

0

soulmerge gelen bu çözüm sadece benim için iyi çalıştı:

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

Çok teşekkürler !!

1

'null' kullanıcısı bunu yorumlarda önerdi, ancak buraya koymak istediği için bu kadar kolay kaçırılmadı.

en iyi seçenek json_decode yani json_decode ikinci parametre olarak yerine sınıfların birleştirici diziler dönüş yapar (TRUE $ veri) DOĞRU geçmektir. Yani kaynak koduna erişiminiz varsa - bu değişikliği yapın.