PHP 7.2用に更新
PHP 7.2では、オブジェクトおよび配列キャストの数値キーの変換に動作上の変更が導入されました。これにより、この特定の不整合が修正され、以下のすべての例が期待どおりに動作します。
混乱することは1つ少なくなります!
元の回答(7.2.0より前のバージョンに適用)
PHPには、あなたが自分の中にいることを本当に望んでいない暗い路地があります。番号である名前を持つオブジェクトプロパティはその1つです...
彼らがあなたに言わなかったこと
事実#1:正当な変数名ではない名前のプロパティには簡単にアクセスできない
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo; // error
事実#2:あなたは、することができます {}括弧構文で、このようなプロパティにアクセス
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
事実#3:しかし、プロパティ名がすべて数字の場合はそうではありません!
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
echo $o->{'123'}; // error!
ライブの例。
事実#4:まあ、そもそもオブジェクトが配列からのものでない限り。
$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?
ライブの例。
かなり直感的だと思いませんか?
あなたにできること
オプション#1:手動で行う
最も実用的な方法は、関心のあるオブジェクトを配列にキャストして、プロパティにアクセスできるようにすることです。
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'}; // error!
echo $a['123']; // OK!
残念ながら、これは再帰的に機能しません。したがって、あなたの場合は次のようなことをする必要があります:
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0']; // at last!
オプション#2:核オプション
別のアプローチは、オブジェクトを配列に再帰的に変換する関数を書くことです:
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'];
ただし、これが全体的に優れたオプションであるとは確信していません。不要なプロパティだけでなく、興味のないプロパティもすべて配列に不必要にキャストするからです。
オプション#3:賢くプレイする
前のオプションの代替方法は、組み込みのJSON関数を使用することです。
$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];
JSON関数は、外部関数を定義する必要なく、配列への再帰的な変換を効果的に実行します。これがどのように見えても、オプション#2の「核」の欠点があり、さらにオブジェクト内に文字列がある場合、それらの文字列をUTF-8でエンコードする必要があるという欠点があります(これはの要件ですjson_encode
)。