連想配列をスマートにグループ化する方法はないものか考えてみた。
ぐぐると、グループ化用のクラスとかもあるっちゃあるし、
ちゃんと探したわけではないけどもしかしたら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."になります^^";
}
どうだろう。
実行したわけではないけど、たぶんこれで「とりあえず」はできるはずなんだけど、
これがスマートかっつーと、とてもじゃないけどスマートとは言えない気もする。
どうしたもんかな。ほかにいい方法ないっすかね。
コメントする