¿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?

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.