Posted on

Hashはいいぞ

誰もが言っていました。配列をいじるなら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には非常に強力な機能はあるけれど、勉強が追い付いていない…。
また今度、追加します。