記事一覧はこちら

(object)による配列のオブジェクト化も注意が必要

$a=array("0"=>"zero","A"=>"B");
$b=json_decode(json_encode($a));
$c=(object)$a;
var_dump($b===$c);

今度は配列に文字列のキーがあるからオブジェクト化してくれるに違いない!だからtrue!

外れです。falseなんです。

$bと$cをvar_dumpした結果はこちら

object(stdClass)#2 (2) {
  ["0"]=>
  string(4) "zero"
  ["A"]=>
  string(1) "B"
}
object(stdClass)#3 (2) {
  [0]=>
  string(4) "zero"
  ["A"]=>
  string(1) "B"
}

zeroのキーが違う!と言うかキーの型が違う!キーの型なんて意識したことねーよォ
例によってjson_decodeのリファレンスを参考に$bのプロパティ0は$b->{'0'}でアクセス出来るのですが、$cのプロパティ0へ直接アクセス出来ません。

print $c->{'0'};
print $c->{"0"};
//print $c->0;//そもそもコンパイルエラー
print $c[0];//そもそも配列じゃないって

全てエラーです。
直接出来ないなら間接的にやればいいじゃないって、つまりforeachで回すわけです。

foreach($c as $key=>$value){
    print "{$key}:{$value}n";
}
// 0:zero
// A:B

それか、配列にキャストしてやれば間接的だけどforeachより直接的にアクセス出来ますね

$a=array("0"=>"zero","A"=>"B");
$c=(object)$a;
$d=(array)$c;
print $d["0"];

って言うか二回もキャストして無駄だよね。

$a=array("0"=>"zero","A"=>"B");
$c=(object)$a;
$d=(array)$c;
print $d["0"];

つまりこういう事だよね。

$a=array("0"=>"zero","A"=>"B");
print $d["0"];

オブジェクトどこいった。そういう事です。

こっちでも不可能という結論に。いやまあforeachで回せば出来…るに入らない? [PHP] オブジェクトでプロパティ名がInteger型のものにアクセスする方法 | gdgdな人がgdgdに書く、gdgdな皆様のためのブログ > Not Classified