Hash::extract でCakePHPの配列地獄から抜け出す
CakePHPの配列地獄から救ってくれるHash::extract
Hash::extract
便利ですよね。
CakePHP 2系だとModelからデータを取得した際に
array(1) { ["User"]=> array(5) { ["id"]=> string(3) "999" ["regtime"]=> string(19) "2014-08-01 11:46:43" ["lasttime"]=> string(19) "2014-08-01 11:46:43" ["sname"]=> string(13) "ああ 太郎" ["name_kana"]=> string(22) "ああ たろう" }
のような形でデータが返ってきます。
このデータをView側に渡してアクセスする際に$data["piyo"]["piyo_id"]
のように記述するのですが、Hash::extract
を使えば$data["piyo_id"]
で記述できます。
Hash — CakePHP Cookbook 2.x ドキュメント
サンプル&解説
user テーブル
から ユーザーの情報を取得するとします。
<?php $user = $this->User->findById($this->login['id']); var_dump($user); ?>
取得したユーザー情報のデータ構造は以下のようになります。
array(1) { ["User"]=> array(5) { ["id"]=> string(3) "999" ["regtime"]=> string(19) "2014-08-01 11:46:43" ["lasttime"]=> string(19) "2014-08-01 11:46:43" ["sname"]=> string(13) "ああ 太郎" ["name_kana"]=> string(22) "ああ たろう" }
View でユーザーIDを表示するには以下のように記述します。
<?php echo $user["User"]["id"] ?>
これを
<?php echo $user["id"] ?>
でユーザーIDを表示できるようにしたいです(要は["User"]
カラムをextract(抜き取る)するわけです)。
それには以下のようにController
側に記述します。
<?php $user = $this->User->findById($this->login['id']); $user = Hash::extract($user, 'User'); var_dump($user); ?>
Hash::extract($user, 'User');
で抽出処理を行っています。
- 最初の引数($user) が抽出する変数
- 2番目の引数('User') が抽出対象のキー
を指定します。
2番目の引数はHash パス構文 が使えます。
すると出力は以下のようになります。
array(5) { ["id"]=> string(3) "999" ["regtime"]=> string(19) "2014-08-01 11:46:43" ["lasttime"]=> string(19) "2014-08-01 11:46:43" ["sname"]=> string(13) "ああ 太郎" ["name_kana"]=> string(22) "ああ たろう" }
これで $user["id"]
でアクセスできるようになりました。
<?php echo $user["id"] ?>
めでたしめでたし。