PHPで連想配列をオブジェクトに、オブジェクトを連想配列に変換する方法

こんにちは、さるまりんです。

PHPのプログラムでデータを扱う時、連想配列が便利でよく使います。一方、オブジェクトも使うことがあるので、これを相互に変換することがあります。

この方法をメモしておきます。

連想配列からオブジェクトへ

(object)にキャスト

最も簡単には、(object)でキャストする方法です。

$array = [
    'name' => 'さるまりん',
    'city' => 'Tokyo'
];

$object = (object) $array;

これをprint_r($object)で出力するとこうなります。

stdClass Object
(
    [name] => さるまりん
    [city] => Tokyo
)

表示されているようにstdClassという標準のクラスのオブジェクトに変換されます。

クラスのプロパティに値をセット

今度は特定のクラスのオブジェクトに変換します。

クラスのオブジェクトを生成してからプロパティに値を設定していきます。

class Person {
    public $name;
    public $city;
}

$array = [
    'name' => 'さるまりん',
    'city' => 'Tokyo'
];

$object = new Person();
foreach ($array as $key => $val) {
    $object->$key = $val;
}

この方法では連想配列のキーと同じ名前のプロパティに値をforeachループでひとつずつセットしていってます。

同じようにprint_r($object)で出力するとこうなります。

Person Object
(
    [name] => さるまりん
    [city] => Tokyo
)

連想配列からPersonクラスのオブジェクトに変換されています。

オブジェクトから連想配列へ

(array)にキャスト

連想配列→オブジェクトの変換で(object)でのキャストをしたように、(array)でキャストして変換します。

$object = new stdClass();
$object->name = 'さるまりん';
$object->city = 'Tokyo';

$array = (array) $object

stdClassのオブジェクトを(array)でキャストしたものをprint_r($array)で表示するとこうなります。

Array
(
    [name] => さるまりん
    [city] => Tokyo
)
get_object_vars()関数

get_object_vars()関数を使用すると、オブジェクトのプロパティとその値を連想配列として取得できます。

class Person {
    public $name;
    public $city;

    private $age = '秘密';
}

$object = new Person();
$object->name = 'さるまりん';
$object->city = 'Tokyo';

$array = get_object_vars($object);

これをprint_r($array)で出力するとこうなります。

Array
(
    [name] => さるまりん
    [city] => Tokyo
)

privateのプロパティである$ageは表示されていませんね。

どのようにデータを扱うのが便利で効率よいのか考えることは大切だと思います。
また、個人的には間違いにくい形を採用するのも大切だなって思います。

どうしたら改善できるのか。いつも考えながらプログラムしたいです。

読んでくださってありがとうございました。
それではまた!