Bagaimana cara mengakses properti objek ini dengan nama ilegal?

115

Saya menggunakan kelas PHP yang ditulis seseorang untuk berinteraksi dengan BaseCamp API.

Panggilan khusus yang saya lakukan adalah mengambil item dalam daftar rencana, yang berfungsi dengan baik.

Masalah saya adalah, saya tidak yakin bagaimana mengakses todo-itemsproperti dari objek yang dikembalikan. Inilah var_dump dari objek yang dikembalikan:

object(stdClass)[6]
  public 'completed-count' => string '0' (length=1)
  public 'description' => string 'Description String' (length=89)
  public 'id' => string '12345' (length=7)
  public 'milestone-id' => string '' (length=0)
  public 'name' => string 'Error Reports' (length=13)
  public 'position' => string '1' (length=1)
  public 'private' => string 'false' (length=5)
  public 'project-id' => string '58904' (length=7)
  public 'tracked' => string 'false' (length=5)
  public 'uncompleted-count' => string '1' (length=1)
  public 'todo-items' => 
    object(stdClass)[3]
      public 'todo-item' => 
        object(stdClass)[5]
          public 'completed' => string 'false' (length=5)
          public 'content' => string 'content string here' (length=133)
          public 'created-on' => string '2009-04-16T20:33:31Z' (length=20)
          public 'creator-id' => string '23423' (length=7)
          public 'id' => string '234' (length=8)
          public 'position' => string '1' (length=1)
          public 'responsible-party-id' => string '2844499' (length=7)
          public 'responsible-party-type' => string 'Person' (length=6)
          public 'todo-list-id' => string '234234' (length=7)
  public 'complete' => string 'false' (length=5)

Bagaimana saya bisa mengakses todo-itemsbagian dari objek ini?

Ian
sumber

Jawaban:

261
<?php
$x = new StdClass();
$x->{'todo-list'} = 'fred';
var_dump($x);

Jadi, $object->{'todo-list'}adalah sub-objeknya. Jika Anda dapat mengaturnya seperti itu, maka Anda juga dapat membacanya dengan cara yang sama:

echo $x->{'todo-list'};

Kemungkinan lain:

$todolist = 'todo-list';
echo $x->$todolist;

Jika Anda ingin mengubahnya menjadi sebuah array, yang bisa sedikit lebih mudah (yaitu $ret['todo-list']akses yang jelas ), kode ini diambil hampir secara kata demi kata dari Zend_Config dan akan mengubahnya untuk Anda.

public function toArray()
{
    $array = array();
    foreach ($this->_data as $key => $value) {
        if ($value instanceof StdClass) {
            $array[$key] = $value->toArray();
        } else {
            $array[$key] = $value;
        }
    }
    return $array;
}
Alister Bulman
sumber
24
Meskipun itu singkat dan manis (dan yang saya rekomendasikan), Anda juga dapat melakukan ini melalui variabel:$todolist='todo-list'; $x->$todolist
Christian
Respon yang sangat terlambat , dengan PHP> 5.5, ada solusi yang lebih baik. Entah castobjek ke array, atau coba get_object_vars().
Owen Beresford
1
@ Christian Sangat bagus! Tapi coba $ x -> {$ todolist}
James Bailey
@JamesBailey, benar. Untuk beberapa alasan, pada waktu itu saya pikir ini hanya tersedia di versi PHP yang lebih baru, tetapi ternyata sudah ada sejak lama: 3v4l.org/nf15N
Christian
28

Coba cara paling sederhana ini!

$obj = $myobject->{'mydash-value'};
$objToArray = array($obj);
Nikunj Dhimar
sumber
4
Jawaban yang baik menyertai contoh kode dengan penjelasan untuk pembaca di masa mendatang. Meskipun orang yang mengajukan pertanyaan ini mungkin memahami jawaban Anda, menjelaskan bagaimana Anda sampai pada pertanyaan itu dapat membantu banyak orang lain.
Stonz2
2
Oh ini jawaban NYATA. Saya mencoba selamanya untuk mengakses nama properti objek dengan '.' di dalamnya dan ini dibersihkan dengan benar!
russellmania