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