[PHP] PHPオブジェクトと配列の変換まとめでは、連想配列からオブジェクトに変換する方法を取り扱った。
CSVからの読み込みのように要素がインデックス付けされている場合はどうしたらいいだろうか。
http://php.net/manual/ja/function.array-combine.php
さっきと同じようにキーの順序は配列で保持しておけばいいけど、array_combineはキーの同値性ではなく、順序でくっつけてしまうので、キーでくっつける関数を用意する必要がある。
データ構造的には$keysのインデックスと値をarray_flip関数で反転させるのが、使いやすい。
http://php.net/manual/ja/function.array-flip.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
0 件のコメント:
コメントを投稿