プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、JSON形式のデータを連想配列として変数に格納する
結論から書くと「json_decode()」関数を使って

$ary_data =  json_decode($json_data, true);

とすればOKでした。
第二引数に「true」を指定すると、連想配列として取得できます。
第二引数にfalseを指定したり、省略した場合は、
アロー演算子(->)でアクセスする形になります。

それでは、詳細を書いていきます。

Twitterの自動投稿処理をPHPに行わせているのですが、
実は今まで、投稿結果をスルーしていました。
これを改良して、エラー発生時はメールを送信するようにしたかったのです。

ほんで、Twitterの自動投稿の結果がJSON形式で返ってくるので、
投稿結果をどうやってバラバラにするべな~?というのが今回のきっかけです。

まぁ、PHPさんのことだから一発変換できる関数とかあるでしょ。

あるよね?

ありますよね?

と期待を込めて調べたら、ありました(*´ェ`*)

その名も「json_decode()」関数です。
名前がそのまんまで素敵ですわぁ(人´∀`)

調べたところ、連想配列で取得したい場合は、
第二引数に「true」を指定するようです。
未指定時(もしくは「false」指定時)はアロー演算子でアクセスする形になります。

早速使ってみました。

というわけで、サンプルです。
まずは、普通にアロー演算子でアクセスする版φ(--)

<?php

$json_data = '{"key1":"value1","key2":{"key2_1":"value2_1", "key2_2":"value2_2", "key2_3":"value2_3"}}';

$ary_data =  json_decode($json_data);

var_dump($ary_data);

print $ary_data->key1 . "\n";
print $ary_data->key2->key2_2 . "\n";

実行結果は、こんなんなりましたφ(--)

object(stdClass)#1 (2) {
  ["key1"]=>
  string(6) "value1"
  ["key2"]=>
  object(stdClass)#2 (3) {
    ["key2_1"]=>
    string(8) "value2_1"
    ["key2_2"]=>
    string(8) "value2_2"
    ["key2_3"]=>
    string(8) "value2_3"
  }
}
value1
value2_2

結果はオブジェクトになっていますね。

試しに連想配列にアクセスするようにしてみるとφ(--)

<?php

$json_data = '{"key1":"value1","key2":{"key2_1":"value2_1", "key2_2":"value2_2", "key2_3":"value2_3"}}';

$ary_data =  json_decode($json_data);

var_dump($ary_data);

//print $ary_data->key1 . "\n";
//print $ary_data->key2->key2_2 . "\n";
print $ary_data["key1"] . "\n";
print $ary_data["key2"]["key2_2"] . "\n";

怒られましたφ(--)

object(stdClass)#1 (2) {
  ["key1"]=>
  string(6) "value1"
  ["key2"]=>
  object(stdClass)#2 (3) {
    ["key2_1"]=>
    string(8) "value2_1"
    ["key2_2"]=>
    string(8) "value2_2"
    ["key2_3"]=>
    string(8) "value2_3"
  }
}
PHP Fatal error:  Cannot use object of type stdClass as array in C:\test\test01.
php on line 11

Fatal error: Cannot use object of type stdClass as array in C:\test\test01.php o
n line 11

それでは、json_decode()の第二引数に「true」を指定して
連想配列として取得してみましょうφ(--)

<?php

$json_data = '{"key1":"value1","key2":{"key2_1":"value2_1", "key2_2":"value2_2", "key2_3":"value2_3"}}';

//$ary_data =  json_decode($json_data);
$ary_data =  json_decode($json_data, true);

var_dump($ary_data);

//print $ary_data->key1 . "\n";
//print $ary_data->key2->key2_2 . "\n";
print $ary_data["key1"] . "\n";
print $ary_data["key2"]["key2_2"] . "\n";

今度は無事に取得できましたφ(--)

array(2) {
  ["key1"]=>
  string(6) "value1"
  ["key2"]=>
  array(3) {
    ["key2_1"]=>
    string(8) "value2_1"
    ["key2_2"]=>
    string(8) "value2_2"
    ["key2_3"]=>
    string(8) "value2_3"
  }
}
value1
value2_2

ちゃんと(連想)配列になっているようです。

アロー演算子でアクセスしてみるとφ(--)

<?php

$json_data = '{"key1":"value1","key2":{"key2_1":"value2_1", "key2_2":"value2_2", "key2_3":"value2_3"}}';

//$ary_data =  json_decode($json_data);
$ary_data =  json_decode($json_data, true);

var_dump($ary_data);

print $ary_data->key1 . "\n";
print $ary_data->key2->key2_2 . "\n";

//print $ary_data["key1"] . "\n";
//print $ary_data["key2"]["key2_2"] . "\n";

スゴイ勢いで怒られましたφ(--)

array(2) {
  ["key1"]=>
  string(6) "value1"
  ["key2"]=>
  array(3) {
    ["key2_1"]=>
    string(8) "value2_1"
    ["key2_2"]=>
    string(8) "value2_2"
    ["key2_3"]=>
    string(8) "value2_3"
  }
}
PHP Notice:  Trying to get property of non-object in C:\test\test01.php on line
10

Notice: Trying to get property of non-object in C:\test\test01.php on line 10

PHP Notice:  Trying to get property of non-object in C:\test\test01.php on line
11

Notice: Trying to get property of non-object in C:\test\test01.php on line 11
PHP Notice:  Trying to get property of non-object in C:\test\test01.php on line
11

Notice: Trying to get property of non-object in C:\test\test01.php on line 11

そんな感じ\(--)/

……あっ、そうそう。
json_decodeの説明欄に

この関数は UTF-8 でエンコードされた文字列でのみ動作します。

と書いてありました。
私は試していませんが、UTF-8以外の環境で使いたい場合は、ご注意ください。
一旦UTF-8に変換してから使えってことでしょうね。

今度こそ、そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事