読者です 読者をやめる 読者になる 読者になる

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"] ?>

めでたしめでたし。