Love澤's Room

管理人のシステム開発奮闘記。更新頻度はそこまで高く無いと思います。いまのところ、技術ネタのみを記録中。今後もしかしたら、普通のブログのように、色々と書いていくかも。

ネスト化されたstdClass ObjectからArrayに変換する方法

(追記)
以下の記事を書いた後、以下のブログを発見しました。
phpで、json_encodeした配列に、json_decodeするとオブジェクトで返って来てしまう - カサヒラボ

<?php
json_decode(json_obj, true)
?>

というように、第二引数にtrueを入れると、arrayにちゃんと変換されました。

以下はもはや読む必要はないのですが、せっかく書いたので残しておきます。

やりたいこと

最終的にやりたいことはこんな感じのこと。データベースから取り出した値をそのままClientに送るのではなく、ちょっとばかり加工してから送りたいよね、ということ。
f:id:love_zawa:20150105074206j:plain
ただ今回、簡単には行かなかったので、その様子をメモ。

状況の確認

MariaDB []> select column_json(dynamic_column) from test_dynamic_column;
+--------------------------------------------------------------------------------+
| dynamic_column                                                                 |
+--------------------------------------------------------------------------------+
| {"1":{"name":"Taro", "password":"hoge"},"2":{"name":"Jiro","password":"huga"}} |
+--------------------------------------------------------------------------------+
  • Server側の処理(PHP)
<?php
//省略
$query = "select column_json(dynamic_column) from test_dynamic_column";
$result = mysqli_fetch_assoc(mysqli_query($db, $query));
echo $result;
?>
$.ajax({
//省略
    success: function(json_result) {}
});

なぜか簡単には行かなかったか

普通、json_decodeしたら、配列や連想配列になるらしい。
(参考)
[PHP] 配列、連想配列⇔JSON形式に変換(json_encode, json_decode): プログラミング研究室

ただし今回、MariaDBからデータを取得してjson_decodeしたら、ArrayじゃなくてstdClass Objectというものになった。
さらに、通常のArrayだと、array[1][2]などのように、簡単に値の取得が可能だが、stdClass Objectの場合は、それでは値の取得はできなかった。

ちょっとググると以下のように値を取り出せるらしいことがわかった。

<?php
$name = $std_class_object->name;
$password = $std_class_object->password;
?>

(参考)
PHP: オブジェクト - Manual
PHP - 連想Keyを使ったArrayの代わりにstdClassを利用する - Qiita

ただしそれは、JSONの形式が「{"name":"Taro","password":"hoge"}」となっている場合。

今回は、その部分がネストされているので、以下のようにすれば大丈夫かと期待したが、だめだった。

<?php
$name = $std_class_object->1;    // $name = {"name":"Taro","password":"hoge"}となることを期待していた
$password = $std_class_object->2;    // $name = {"name":"Jiro","password":"huga"}となることを期待していた
?>

さらに色々と調べてみると、get_object_vars()メソッドを使わなければいけないらしいことがわかった。
(参考)
PHP stdClass to Array and Array to stdClass – stdClass Object | If Not True Then False

stdClass ObjectからArrayに変換する様子

<?php
//省略
$query = "select column_json(dynamic_column) from test_dynamic_column";
$result = mysqli_fetch_assoc(mysqli_query($db, $query));
$std_class_object = json_decode($result);
print_r($std_class_object);
?>
-------結果-------
stdClass Object
(
    [1] => stdClass Object
        (
            [name] => Taro
            [password] => hoge
        )

    [2] => stdClass Object
        (
            [name] => Jiro
            [password] => huga
        )
)
------------------
<?php
$semi_array_object = get_object_vars($std_class_object);
print_r($semi_array_object);
?>

-------結果-------
Array
(
    [1] => stdClass Object
        (
            [name] => Taro
            [password] => hoge
        )
    [2] => stdClass Object
        (
            [name] => Jiro
            [password] => huga
        )
)
------------------
<?php
$array_list1 = get_object_vars($semi_array_object)[1];
$array_list1 = get_object_vars($semi_array_object)[2];
print_r($array_list1);
print_r($array_list1);
?>
-------結果-------
Array
(
    [name] => Taro
    [password] => hoge
)
Array
(
    [name] => Jiro
    [password] => huga
)
------------------

ということで、長かったが、以上のように、get_object_vars()メソッドを使うことで、ネスト化されたstdClass Objectから目的の値のみを取り出すことができることがわかった。