[CakePHP] Setクラスを使ってコード量を減らす
iPhoneを買って良かったことの半分はGoogle Mapsが歩くときのナビになることです。tanakaです。今回は、CakePHPを使うときにSetクラスを使ってコード量を減らすサンプルを紹介します。Setクラスは、配列を多用するCakeだからこそ「使える」ライブラリといえます。
配列の深い場所から値をとりだして連結する Set::extract()
例えば、ブログアプリを作っているとします。ブログの記事にはタグを付けることができて、タグのデータは次のようにDBから取り出したとしましょう。
Array
(
[0] => Array
(
[Tag] => Array
(
[id] => 1
[name] => PHP
[created] => 2009-09-15 21:41:22
)
)
[1] => Array
(
[Tag] => Array
(
[id] => 2
[name] => CakePHP
[created] => 2009-09-15 21:41:22
)
)
[2] => Array
(
[Tag] => Array
(
[id] => 3
[name] => JavaScript
[created] => 2009-09-15 21:41:22
)
)
)
ブラウザで表示させるために、このタグ群からタグ名を取り出して、", "をはさんで連結させたいとします。Setを使わなくてもforeachでループして、ひとつずつ値を取り出してもたいした量のコードにはなりませんが、Set::extract()を使えば短く書くことができます。
Set::extract()を使わないコードの例
$tagNames = array();
foreach($tags as $tag) {
$tagNames[] = $tag['Tag']['name'];
}
debug(implode(', ', $tagNames));
Set::extract()を使ったコードの例
debug(implode(', ', Set::extract('/Tag/name', $tags)));
Set::extract()では配列の場所を文字列(パス)として指定します。すると、一致した部分の値だけ取り出した配列を返してくれますので、あとは連結させるだけです。
いまの、Set::extract()は、ブログ記事に複数のタグがついているような、hasManyなデータ構造のものをビューで表示させるときに役立つでしょう。
その他にSet::extract()は、単に値を取り出すときも役に立ちます。例えばバリデーションするときに、空の配列を$array['key']という風に参照しようとするとNoticeエラーになるので、isset()を使って事前チェックをすることになるかもしれません。しかし、Set::extract()を使えば、キーがない場合nullが返ってくるので、エラーになりません。バリデーションで値を取り出すとき、記述が1度で済みます。(もし、値にnullが入っている場合があって区別しないといけない場合は使えませんが…)
Setでその他に使えそうなメソッド
ドキュメントでメソッドとサンプルコードを参照できます。
Set::format()
まだ使ったことはありませんが、配列から値を取り出すことと整形を兼ねていて使いやすそうです。
まとめ
Setクラスは配列を多用することになるCakeでは便利なクラスです。配列で面倒そうな処理を記述するときは、Setクラスで使えるメソッドがないか検討してみてください。(メソッド名が想定していたものと異なることが割とあるかもしれませんが…)