sorunları Nesne stdclass

6 Cevap php

Ben PHP kullanarak aşağıda belirtilen verileri ayrıştırmak için mücadele ediyorum. Bir API döner ve ben çeşitli sözdizimi denedim. Nasıl bir nesne olmayan bir şekilde verileri dönmek? Veya, stdclass kullanarak verileri aramak için sözdizimi nedir?

Ben bir veri tabanlı dizi, hatta iki bu çevirebiliriz? Bu itiraz-tabanlı veri setleri geldiğinde ben kayboldum.

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

        )

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

        )

)

Benim kendi nesnesi oluşturun ve sonra bir var_dump yaptığınızda, ben bu olsun:

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"
    }
  }
}

6 Cevap

Onlar muhtemelen kendi kod nesnelere diziler döküm vardır ($object = (object) $array). (Nesneler ile varsayılan olarak) Bu andan itibaren başvuru geçirilecek avantajına sahiptir ve nesne tamamen yararsız olduğunu dezavantajı (üye numaraları ile başlayamaz - regex in PHP's docs bakınız) Senin kadar (PHP bazı çok gizemli şeylere izin vermez) geri döküm:

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

Kullanın:

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

Temelde nesne erişimcisine olarak bu değişkeni kullanarak sonra, bir değişkene bir dize atayarak kısa kesim demektir.

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

Ben artık kendi kodunu bakıyorum, ve ne yazık ki, onlar bir stdClass nesne ağacında vs ilişkisel dizi ağaç olarak veri istemek için kendi sınıfında seçeneği maruz ettik.

"Problem" class.sunlightlabs.php hattı 96 yer almaktadır

return json_decode( $data );

Bir kaç seçenek var.

  1. Sadece stdClass sözdizimini kullanın.
  2. Bir ilişkisel dizi birine döndü stdClass ağacı dönüştürmek

Eylem # 1

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

Eylem içerisinde 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;
}

Ayrıca desen bazı yaratıcı doğrudan uygulama üzerinden kendi sınıf işe yarayabilir, ama onlar bunu biraz zorlaştırıyor zaten sublcasses ağır yararlanmak, bu yüzden bu iki çözümlerden biri sopa istiyorum.

Böyle nesnesi üzerinden yineleme yapabilirsiniz:

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

Kullanıcı 'null' yorumlarında bu önerdi, ama öyle tefriş cevapsız değil bu yüzden buraya koymak istiyorum.

En iyi seçenek json_decode yani ilişkilendirilebilir diziler yerine sınıflarını dönmek yapar json_decode($data, TRUE) olan ikinci parametre olarak TRUE geçmektir. Yani kaynak koduna erişiminiz varsa - bu değişikliği yapmak.

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

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

Thanks a lot!