PHP7.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
があるという欠点があります(これはの要件です)。