[PHP] 配列からオブジェクトへの変換の続き

2018年10月9日火曜日

PHP

[PHP] PHPオブジェクトと配列の変換まとめでは、連想配列からオブジェクトに変換する方法を取り扱った。
CSVからの読み込みのように要素がインデックス付けされている場合はどうしたらいいだろうか。

array_combine

キーと値の配列から連想配列を作成するにはarray_combine関数を使えば、簡単にできる。
$keys = [ 'name', 'color', 'weight' ];
$values = [ 'apple', 'red', 100 ];

$arr = array_combine($keys, $values);
var_dump($arr);

// array(3) {
//   ["name"]=>
//   string(5) "apple"
//   ["color"]=>
//   string(3) "red"
//   ["weight"]=>
//   int(100)
// }

http://php.net/manual/ja/function.array-combine.php

objectにキャスト

あとはこれをobjectにキャストするだけ。
$obj = (object)$arr;
var_dump($obj);

// object(stdClass)#1 (3) {
//   ["name"]=>
//   string(5) "apple"
//   ["color"]=>
//   string(3) "red"
//   ["weight"]=>
//   int(100)
// }

オブジェクトから配列へ

逆にオブジェクトからキーの順序を持った配列にするのはちょっとめんどくさい。
さっきと同じようにキーの順序は配列で保持しておけばいいけど、array_combineはキーの同値性ではなく、順序でくっつけてしまうので、キーでくっつける関数を用意する必要がある。
function hash_combine(array $keys, array $values): array {
    $ret = [];
    foreach ($keys as $i => $key) {
        $ret[$key] = $values[$i];
    }
    return $ret;
}

$keys = [ 'name', 'color', 'weight' ];
$index = array_flip($keys);

$obj = new stdClass();
$obj->color = 'yellow';
$obj->weight = 20;
$obj->name = 'banana';
$hash = (array)$obj;

$arr = hash_combine($index, $hash);
var_dump($arr);

// array(3) {
//   [0]=>
//   string(6) "banana"
//   [1]=>
//   string(6) "yellow"
//   [2]=>
//   int(20)
// }

データ構造的には$keysのインデックスと値をarray_flip関数で反転させるのが、使いやすい。

http://php.net/manual/ja/function.array-flip.php