Aktualisiert für PHP 7.2
PHP 7.2 führte eine Verhaltensänderung beim Konvertieren von numerischen Schlüsseln in Objekt- und Array-Casts ein , die diese besondere Inkonsistenz behebt und dafür sorgt, dass sich alle folgenden Beispiele wie erwartet verhalten.
Eine Sache weniger zu verwirren!
Ursprüngliche Antwort (gilt für Versionen vor 7.2.0)
PHP hat seinen Anteil an dunklen Gassen, in denen Sie sich wirklich nicht wiederfinden wollen. Objekteigenschaften mit Namen, die Zahlen sind, sind eine davon ...
Was sie dir nie erzählt haben
Fakt Nr. 1: Sie können nicht einfach auf Eigenschaften mit Namen zugreifen, die keine legalen Variablennamen sind
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo; // error
Fakt 2: Sie können auf solche Eigenschaften mit geschweifter Klammer-Syntax zugreifen
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
Fakt Nr. 3: Aber nicht, wenn der Eigenschaftsname nur aus Ziffern besteht!
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
echo $o->{'123'}; // error!
Live Beispiel .
Fakt Nr. 4: Nun, es sei denn, das Objekt stammt überhaupt nicht aus einem Array.
$a = array('123' => '123');
$o1 = (object)$a;
$o2 = new stdClass;
$o2->{'123'} = '123'; // setting property is OK
echo $o1->{'123'}; // error!
echo $o2->{'123'}; // works... WTF?
Live Beispiel .
Ziemlich intuitiv, stimmst du nicht zu?
Was du tun kannst
Option 1: manuell ausführen
Der praktischste Ansatz besteht darin, das gewünschte Objekt einfach wieder in ein Array umzuwandeln, mit dem Sie auf die Eigenschaften zugreifen können:
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'}; // error!
echo $a['123']; // OK!
Dies funktioniert leider nicht rekursiv. In Ihrem Fall müssten Sie also Folgendes tun:
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0']; // at last!
Option 2: die nukleare Option
Ein alternativer Ansatz wäre das Schreiben einer Funktion, die Objekte rekursiv in Arrays konvertiert:
function recursive_cast_to_array($o) {
$a = (array)$o;
foreach ($a as &$value) {
if (is_object($value)) {
$value = recursive_cast_to_array($value);
}
}
return $a;
}
$arr = recursive_cast_to_array($myVar);
$value = $arr['highlighting']['448364']['Data']['0'];
Ich bin jedoch nicht davon überzeugt, dass dies auf ganzer Linie eine bessere Option ist, da unnötigerweise alle Eigenschaften, an denen Sie nicht interessiert sind, sowie die Eigenschaften, die Sie sind, in Arrays umgewandelt werden.
Option 3: Clever spielen
Eine Alternative zur vorherigen Option ist die Verwendung der integrierten JSON-Funktionen:
$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];
Die JSON-Funktionen führen eine rekursive Konvertierung in ein Array durch, ohne dass externe Funktionen definiert werden müssen. So wünschenswert dies auch aussieht, es hat den "Nuke" -Nachteil von Option 2 und zusätzlich den Nachteil, dass, wenn sich in Ihrem Objekt Zeichenfolgen befinden, diese Zeichenfolgen in UTF-8 codiert werden müssen (dies ist eine Anforderung von json_encode
).