Posted on

Hashはいいぞ Hash::combine編

去年からだいぶHash::なんとかを使い続けて、だいぶ手に馴染んできました。foreachのほうが分かりやすい場合は、素直にforeachを回したらいいんですが、select用のリストをfind結果の複数のカラムから作る、みたいなことにHash::combineを使えると非常に見通しが良いです。なんてったって「配列のこれをキーとして、これを値とする配列を作る」ですもの。

  1. // Model->find('all') したときありがちな配列  
  2. $data = [  
  3.     o => [  
  4.         'Color'=>[  
  5.             'id'=>'960018',  
  6.             'name'=>'カーマイン',  
  7.             'red'=>'150',  
  8.             'green'=>'2',  
  9.             'blue'=>'24',  
  10.         ]  
  11.     ],  
  12.     1 => [  
  13.         'Color'=>[  
  14.             'id'=>'00896B',  
  15.             'name'=>'ビリジアン',  
  16.             'red'=>'0',  
  17.             'green'=>'136',  
  18.             'blue'=>'53',  
  19.         ]  
  20.     ],  
  21.     2 => [  
  22.         'Color'=>[  
  23.             'id'=>'434DA2',  
  24.             'name'=>'ウルトラマリン',  
  25.             'red'=>'67',  
  26.             'green'=>'77',  
  27.             'blue'=>'162',  
  28.         ]  
  29.     ]  
  30. ];  
  31.   
  32. // [id => 色名]  
  33. $result_1 = Hash::combine($data,'{n}.Color.id','{n}.Color.name');  
  34. /** 
  35. $result_1 = [ 
  36.     '960018'=>'カーマイン', 
  37.     '00896B'=>'ビリジアン', 
  38.     '434DA2'=>'ウルトラマリン', 
  39. ]; 
  40. */  
  41.   
  42. // [id => 'Rスペース詰め3桁,Gスペース詰め3桁,Bスペース詰め3桁']  
  43. $result_2 = Hash::combine($data,'{n}.Color.id',['%3d,%3d,%3d','{n}.Color.red','{n}.Color.green','{n}.Color.blue']);  
  44. /** 
  45. $result_2 = [ 
  46.     '960018'=>'150,  2, 24', 
  47.     '00896B'=>'  0,136, 53', 
  48.     '434DA2'=>' 67, 77,162', 
  49. ]; 
  50. ※ 配列のキー側引数も配列でsprintf記法指定できる 
  51. */  

どっちも、フォームの選択肢を作るとき凄い役に立ちます。
パス記法に慣れると、いくつも組み合わせてprintfの指定をすれば配列のキーも値も自在に組めます。
もうforeachでぐるぐる検索結果を回しては文字列をこねくり回して…みたいなことはしなくていい!

単純に「これとこれとこれを取り出して配列を作りたい!」とき、使ってください。