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

技術

(追記)
簡単な方法が分かりました。

<?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から目的の値のみを取り出すことができることがわかった。

コメント

タイトルとURLをコピーしました