Comment accéder à cette propriété d'objet avec un nom illégal?

115

J'utilise une classe PHP que quelqu'un a écrite pour s'interfacer avec l'API BaseCamp.

L'appel particulier que je fais est de récupérer les éléments dans une liste de tâches, ce qui fonctionne bien.

Mon problème est que je ne sais pas comment accéder uniquement à la todo-itemspropriété de l'objet renvoyé. Voici le var_dump de l'objet retourné:

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)

Comment puis-je accéder à la todo-itemspartie de cet objet?

Ian
la source

Réponses:

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

Alors, $object->{'todo-list'}est le sous-objet. Si vous pouvez le définir comme ça, vous pouvez également le lire de la même manière:

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

Une autre possibilité:

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

Si vous vouliez le convertir en un tableau, ce qui peut être un peu plus facile (c'est-à-dire l' $ret['todo-list']accès évident ), ce code est repris presque textuellement de Zend_Config et sera converti pour vous.

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
la source
24
Bien que ce soit court et doux (et ce que je recommanderais), vous pouvez également le faire via des variables:$todolist='todo-list'; $x->$todolist
Christian
Réponse très tardive , avec PHP> 5.5, il existe de meilleures solutions. Soit castl'objet d'un tableau, soit essayez get_object_vars().
Owen Beresford le
1
@christian Très gentil! Mais essayez $ x -> {$ todolist}
James Bailey
@JamesBailey, à droite. Pour une raison quelconque, à ce moment-là, je pensais que cela n'était disponible que dans les nouvelles versions de PHP, mais cela existe depuis un certain temps apparemment: 3v4l.org/nf15N
Christian
28

Essayez cette manière la plus simple!

$obj = $myobject->{'mydash-value'};
$objToArray = array($obj);
Nikunj Dhimar
la source
4
Les bonnes réponses accompagnent les exemples de code avec une explication pour les futurs lecteurs. Bien que la personne qui pose cette question puisse comprendre votre réponse, expliquer comment vous y êtes parvenu pourrait aider d'innombrables autres personnes.
Stonz2
2
Oh c'est la VRAIE réponse. J'essayais pour toujours d'accéder à un nom de propriété d'objet avec un '.' dedans et cela a nettoyé ça!
russellmania