Love澤's Room

技術系ネタをまとめていたブログ。現在はカテゴリにこだわらず更新中。

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

新サイトへ移転しました
約3秒後に自動的にリダイレクトします。


(追記)
以下の記事を書いた後、以下のブログを発見しました。
http://d.hatena.ne.jp/kasahi/20070806/1186419785

<?php
json_decode(json_obj, true)
?>

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

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

やりたいこと

最終的にやりたいことはこんな感じのこと。データベースから取り出した値をそのままClientに送るのではなく、ちょっとばかり加工してから送りたいよね、ということ。

ただ今回、簡単には行かなかったので、その様子をメモ。

状況の確認

  • MariaDBの中身
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;
?>
  • Client側の処理(Javascript)
$.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
連想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 &#8211; 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から目的の値のみを取り出すことができることがわかった。