¿Cómo accedo a esta propiedad de objeto con un nombre ilegal?

115

Estoy usando una clase de PHP que alguien escribió para interactuar con la API BaseCamp.

La llamada en particular que estoy haciendo es recuperar los elementos de una lista de tareas pendientes, lo que funciona bien.

Mi problema es que no estoy seguro de cómo acceder solo a la todo-itemspropiedad del objeto que se devuelve. Aquí está el var_dump del objeto devuelto:

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)

¿Cómo puedo acceder a la todo-itemsparte de este objeto?

Ian
fuente

Respuestas:

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

Entonces, $object->{'todo-list'}es el subobjeto. Si puede configurarlo así, también puede leerlo de la misma manera:

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

Otra posibilidad:

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

Si desea convertirlo en una matriz, que puede ser un poco más fácil (es decir, el $ret['todo-list']acceso obvio ), este código se toma casi literalmente de Zend_Config y se convertirá por usted.

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
fuente
24
Aunque es breve y dulce (y lo que recomendaría), también puede hacerlo a través de variables:$todolist='todo-list'; $x->$todolist
Christian
Respuesta muy tardía , con PHP> 5.5, hay mejores soluciones. O castel objeto a una matriz o prueba get_object_vars().
Owen Beresford
1
@cristiano ¡Muy bonito! Pero prueba $ x -> {$ todolist}
James Bailey
@JamesBailey, cierto. Por alguna razón, en ese momento pensé que esto estaba disponible solo en versiones más nuevas de PHP, pero aparentemente ha estado allí desde hace un tiempo: 3v4l.org/nf15N
Christian
28

¡Prueba esta forma más sencilla!

$obj = $myobject->{'mydash-value'};
$objToArray = array($obj);
Nikunj Dhimar
fuente
4
Las buenas respuestas acompañan a los ejemplos de código con una explicación para futuros lectores. Si bien la persona que hace esta pregunta puede entender su respuesta, explicar cómo llegó a ella podría ayudar a muchos otros.
Stonz2
2
Oh, esta es la respuesta REAL. Siempre intentaba acceder a un nombre de propiedad de objeto con un '.' en él y esto lo limpió!
russellmania