スマートなグループ化

| | コメント(0) | トラックバック(0)
連想配列をスマートにグループ化する方法はないものか考えてみた。


ぐぐると、グループ化用のクラスとかもあるっちゃあるし、
ちゃんと探したわけではないけどもしかしたらPEARあたりのモジュールに存在するかもしれない。
けど、どうやればスマートなのか考えてみた。


テスト用に以下の配列を用意

1,2,aaa,100,20080210
1,2,bbb,150,20080210
2,2,aaa,100,20080209
1,1,bbb,280,20080210

DBに存在するのであれば、SQL構文のgroup byあたりを利用したら簡単に済む話なのだが、
じゃあこれがテキストデータの場合はどうだろう と。

//配列を1こ用意しておく
$hoge_array = array();

//まずはファイルを読み込む
$logs = file("/root/log/log.dat");

//とりあえずマワス。中身は言わずと知れたログ1行分の処理
foreach($logs as $log){
    //各データはカンマ区切りなのでexplodeで分離する
    $value = explode(",",$log);
    //グループ化したいやつらをキー値として事前に用意した配列に収める
    //じゃあログの1番目の値と2番目の値でグループ化するとする
    //で、グループごとにログの3番目の値の合計がほしいとする
    $hoge_array[$value[0]."@@@".$value[1]][] = $value[3];
}

/*
ここまで、$hoge_arrayに入っているのは、
「ログの1番目と2番目の値を"@@@"で連結したものをキー値とし、
各キーの値は、3番目の値を配列にしたもの」
ってことになる。
ので、合計を出すには・・・・
*/

//またまわす
foreach($hoge_array as $k=>$hoges){
    //キーの値は1番目と2番目の値なので
    $keys = explode("@@@",$k);

    print "一番目の値が"$keys[0]."かつ、2番目の値が".$keys[1]."の3番目の値の合計は";

    //この1処理分の配列の値は、3番目の値を配列として格納してあるものなので
    //またもやまわす。ついでに合計用に$sumっていう変数を用意しておこうか!
    $sum = 0;
    foreach($hoges as $hoge) $sum = $sum + $hoge;

    print $sum."になります^^";
}


どうだろう。
実行したわけではないけど、たぶんこれで「とりあえず」はできるはずなんだけど、
これがスマートかっつーと、とてもじゃないけどスマートとは言えない気もする。
どうしたもんかな。ほかにいい方法ないっすかね。

トラックバック(0)

このブログ記事を参照しているブログ一覧: スマートなグループ化

このブログ記事に対するトラックバックURL: http://vivaugu.net/blog/mt-tb.cgi/1156

コメントする

アーカイブ

ウェブページ