Làm cách nào để truy cập thuộc tính đối tượng này với tên bất hợp pháp?


115

Tôi đang sử dụng một lớp PHP mà ai đó đã viết để giao tiếp với API BaseCamp.

Cuộc gọi cụ thể mà tôi đang thực hiện là truy xuất các mục trong danh sách việc cần làm, hoạt động tốt.

Vấn đề của tôi là, tôi không chắc làm thế nào để chỉ truy cập thuộc todo-itemstính của đối tượng được trả về. Đây là var_dump của đối tượng được trả về:

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)

Làm cách nào để truy cập todo-itemsphần của đối tượng này?

Câu trả lời:


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

Vì vậy, $object->{'todo-list'}là sub-object. Nếu bạn có thể đặt nó như vậy, thì bạn cũng có thể đọc nó theo cách tương tự:

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

Khả năng khác:

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

Nếu bạn muốn chuyển đổi nó thành một mảng, có thể dễ dàng hơn một chút (tức là $ret['todo-list']truy cập rõ ràng ), mã này được lấy gần như nguyên văn từ Zend_Config và sẽ chuyển đổi cho bạn.

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

24
Mặc dù đó là ngắn và ngọt ngào (và những gì tôi muốn khuyên), bạn cũng có thể làm được điều này thông qua các biến:$todolist='todo-list'; $x->$todolist
Christian

Phản hồi rất muộn , với PHP> 5.5, có những giải pháp tốt hơn. Hoặc là castđối tượng để một mảng, hoặc thử get_object_vars().
Owen Beresford

1
@christian Rất hay! Nhưng hãy thử $ x -> {$ todolist}
James Bailey

@JamesBailey, đúng. Vì một số lý do, tại thời điểm đó tôi nghĩ rằng điều này chỉ có sẵn trong các phiên bản PHP mới hơn, nhưng nó đã có từ lâu rồi: 3v4l.org/nf15N
Christian

28

Hãy thử cách đơn giản nhất này!

$obj = $myobject->{'mydash-value'};
$objToArray = array($obj);

4
Các câu trả lời hay đi kèm với các mẫu mã với lời giải thích cho các độc giả trong tương lai. Mặc dù người hỏi câu hỏi này có thể hiểu câu trả lời của bạn, nhưng việc giải thích cách bạn đến câu hỏi này có thể giúp ích cho vô số người khác.
Stonz2

2
Ồ đây là câu trả lời THỰC SỰ. Tôi đã cố gắng mãi mãi để truy cập vào một tên thuộc tính đối tượng có dấu '.' trong đó và điều này đã làm sạch điều đó!
russellmania
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.