PHP
リファクタリング
for

PHPで、名前が1,2,3...と続く同じ種類のカラム名をfor文で回す

■やりたいこと

例えば、

city_id_1, city_id_2, city_id_3

のようなカラム名があって、全てに値が入っているとする。
「清瀬市」みたいな表示をさせるには、city_id_1をどっかで日本語に変更するメソッドが必要(View側で処理はしない前提)
上記を素直に実装すると以下になる。
//ModelはModel_Mst_City カラム名はname $order->city_id_1(2,3)が格納されているという仮定

php
/**
 * 市区町村idを元に、該当の名前を取得する。
 *
 * @param object $order
 * @return array
 */
public static function getCityName($order)
    {
        $buff = array();
        $buff[1] = Model_Mst_City::find($order->city_id_1);
        $buff[2] = Model_Mst_City::find($order->city_id_2);
        $buff[3] = Model_Mst_City::find($order->city_id_3);

        return $buff;
    }

変化しているのがただの1,2,3なので、なんとかまとめたい。

■結論

php
/**
 * 市区町村idを元に、該当の名前を取得する。
 *
 * @param object $order
 * @return array
 */
public static function getCityName($order)
    {
        $buff = array();
        for ($i=1; $i<=3; $i++)
        {
            $buff[$i] = Model_Mst_City::find($order->{'city_id'.$i});
        }

        return $buff;
    }

結局クエリを3回取りに行っているので、リファクタリングにはなってない気がするけど、{}を使ってまとめられるのは知らなかったのでメモ。