去年からだいぶHash::なんとかを使い続けて、だいぶ手に馴染んできました。foreachのほうが分かりやすい場合は、素直にforeachを回したらいいんですが、select用のリストをfind結果の複数のカラムから作る、みたいなことにHash::combineを使えると非常に見通しが良いです。なんてったって「配列のこれをキーとして、これを値とする配列を作る」ですもの。
- // Model->find('all') したときありがちな配列
- $data = [
- o => [
- 'Color'=>[
- 'id'=>'960018',
- 'name'=>'カーマイン',
- 'red'=>'150',
- 'green'=>'2',
- 'blue'=>'24',
- ]
- ],
- 1 => [
- 'Color'=>[
- 'id'=>'00896B',
- 'name'=>'ビリジアン',
- 'red'=>'0',
- 'green'=>'136',
- 'blue'=>'53',
- ]
- ],
- 2 => [
- 'Color'=>[
- 'id'=>'434DA2',
- 'name'=>'ウルトラマリン',
- 'red'=>'67',
- 'green'=>'77',
- 'blue'=>'162',
- ]
- ]
- ];
- // [id => 色名]
- $result_1 = Hash::combine($data,'{n}.Color.id','{n}.Color.name');
- /**
- $result_1 = [
- '960018'=>'カーマイン',
- '00896B'=>'ビリジアン',
- '434DA2'=>'ウルトラマリン',
- ];
- */
- // [id => 'Rスペース詰め3桁,Gスペース詰め3桁,Bスペース詰め3桁']
- $result_2 = Hash::combine($data,'{n}.Color.id',['%3d,%3d,%3d','{n}.Color.red','{n}.Color.green','{n}.Color.blue']);
- /**
- $result_2 = [
- '960018'=>'150, 2, 24',
- '00896B'=>' 0,136, 53',
- '434DA2'=>' 67, 77,162',
- ];
- ※ 配列のキー側引数も配列でsprintf記法指定できる
- */
どっちも、フォームの選択肢を作るとき凄い役に立ちます。
パス記法に慣れると、いくつも組み合わせてprintfの指定をすれば配列のキーも値も自在に組めます。
もうforeachでぐるぐる検索結果を回しては文字列をこねくり回して…みたいなことはしなくていい!
単純に「これとこれとこれを取り出して配列を作りたい!」とき、使ってください。