129

I'm using a PHP class someone wrote to interface with the BaseCamp API.

The particular call I'm doing is to retrieve the items in a todo list, which works fine.

My problem is, I'm not sure how to access just the todo-items property of the object that is returned. Here's the var_dump of the returned object:

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)

How can I access the todo-items portion of this object?

AbraCadaver
  • 78,200
  • 7
  • 66
  • 87
Ian
  • 11,920
  • 27
  • 61
  • 77

2 Answers2

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

So, $object->{'todo-list'} is the sub-object. If you can set it like that, then you can also read it the same way:

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

Another possibility:

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

If you wanted to convert it to an array, which can be a little more easily (ie the obvious $ret['todo-list'] accessing), this code is taken almost verbatim from Zend_Config and will convert for you.

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;
}
AbraCadaver
  • 78,200
  • 7
  • 66
  • 87
Alister Bulman
  • 34,482
  • 9
  • 71
  • 110
  • 26
    Although that's short and sweet (and what I'd recommend), you can also do this via variables: `$todolist='todo-list'; $x->$todolist` – Christian Nov 26 '10 at 08:23
  • *Very late response*, with PHP > 5.5, there are better solutions. Either `cast` the object to an array, or try `get_object_vars()`. – Owen Beresford Apr 09 '16 at 10:34
  • 2
    @christian Very nice! But try $x->{$todolist} – James Bailey May 25 '18 at 15:09
  • @JamesBailey, right. For some reason, at that time I thought this was available only in newer versions of PHP, but it's been there since a while apparently: https://3v4l.org/nf15N – Christian May 26 '18 at 18:20
30

Try this simplest way!

$obj = $myobject->{'mydash-value'};
$objToArray = array($obj);
Nikunj Dhimar
  • 2,296
  • 19
  • 24
  • 4
    Good answers accompany code samples with an explanation for future readers. While the person asking this question may understand your answer, explaining how you arrived at it could help countless others. – Stonz2 Sep 24 '14 at 13:39
  • 2
    Oh this is the REAL answer. I was trying forever to access an object property name with a '.' in it and this cleaned that right up! – russellmania Apr 14 '16 at 19:42