Wie greife ich mit einem unzulässigen Namen auf diese Objekteigenschaft zu?

115

Ich verwende eine PHP-Klasse, die jemand geschrieben hat, um eine Schnittstelle mit der BaseCamp-API herzustellen.

Der besondere Aufruf, den ich mache, besteht darin, die Elemente in einer Aufgabenliste abzurufen, was gut funktioniert.

Mein Problem ist, ich bin nicht sicher, wie ich nur auf die todo-itemsEigenschaft des zurückgegebenen Objekts zugreifen soll. Hier ist der var_dump des zurückgegebenen Objekts:

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)

Wie kann ich auf den todo-itemsTeil dieses Objekts zugreifen ?

Ian
quelle

Antworten:

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

So $object->{'todo-list'}ist das Unterobjekt. Wenn Sie es so einstellen können, können Sie es auch auf die gleiche Weise lesen:

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

Andere Möglichkeit:

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

Wenn Sie es in ein Array konvertieren möchten, das etwas einfacher sein kann (dh der offensichtliche $ret['todo-list']Zugriff), wird dieser Code fast wörtlich aus Zend_Config übernommen und für Sie konvertiert.

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
quelle
24
Obwohl das kurz und bündig ist (und was ich empfehlen würde), können Sie dies auch über Variablen tun:$todolist='todo-list'; $x->$todolist
Christian
Sehr späte Antwort , mit PHP> 5.5 gibt es bessere Lösungen. Entweder castdas Objekt zu einem Array oder versuchen get_object_vars().
Owen Beresford
1
@christian Sehr schön! Aber versuchen Sie $ x -> {$ todolist}
James Bailey
@ JamesBailey, richtig. Aus irgendeinem Grund dachte ich damals, dass dies nur in neueren Versionen von PHP verfügbar war, aber es ist anscheinend schon eine Weile da: 3v4l.org/nf15N
Christian
28

Versuchen Sie diesen einfachsten Weg!

$obj = $myobject->{'mydash-value'};
$objToArray = array($obj);
Nikunj Dhimar
quelle
4
Gute Antworten begleiten Codebeispiele mit einer Erklärung für zukünftige Leser. Während die Person, die diese Frage stellt, Ihre Antwort möglicherweise versteht, kann es unzähligen anderen helfen, zu erklären, wie Sie dazu gekommen sind.
Stonz2
2
Oh, das ist die WIRKLICHE Antwort. Ich habe für immer versucht, auf einen Objekteigenschaftsnamen mit einem '.' Zuzugreifen. drin und das hat das richtig aufgeräumt!
Russellmania