誰もが言っていました。配列をいじるならHashを使えと。
Hash::get()だけは結構使っていました。配列に存在しない引数を引いてもnotice出さずにnullを返してくれる。
それでも、勉強するのは面倒で、ついついforeachをぶん回していろいろやっていました。
この冬、ふとHash::insertを使おうと思い立ったんです。
「たったこれだけのためにforeach書くのめんどい」という状況が増えていたのです。
誰もが言っていた通り、Hashは良いものでした。
親子関係のあるテーブルを想像してください。
parentsテーブルがあって、childrenテーブルにparent_idを持っている、よくある parents has many childrenという関係です。
都合によりモデルにリレーションを固定していないので、毎回保存のたびに親子関係idをくっつけておく必要がある、という前提で…
//トランザクション中 if(!$this->Parent->save($parent_data)){ $this->Parent->rollback(); return false; } $parent_id=$this->Parent->getID(); //childrenにとにかくparent_idだけ付けなおす foreach($children as $key=>$child){ $children[$key]['parent_id']=$parent_id; } //(後略)
この、ID付与の為だけのforeachを見飽きたんです。
Hashを使えるとここが…
//整数キー直下の配列全部に”parent_id”を追加する Hash::insert($children,'{n}.parent_id',$parent_id);
一行。何よりもやってることがすっきり見える。任意の整数とマッチする{n}という書き方が強い。
foreachが出ると読み手はループを身構えるから、「任意の~全部に操作」という話が見えにくい。
やっていることは同じなのに、配列的バッチ操作として書けるのは本当に助かる。
他にもHashには非常に強力な機能はあるけれど、勉強が追い付いていない…。
また今度、追加します。