去年からだいぶ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でぐるぐる検索結果を回しては文字列をこねくり回して…みたいなことはしなくていい!
単純に「これとこれとこれを取り出して配列を作りたい!」とき、使ってください。