▽1
●
うぃんど ●140ポイント ベストアンサー |
一例
<?php // データ $id = array(1,2,1,3,2,1,3); $data = array(10,20,12,25,10,14,5); $sort = array(1,2,3,4,5,6,7); // 集計準備 $cnt = count($id); $sort_min = array(); $sum = array(); // 集計 for ( $i =0; $i < $cnt; $i++ ) { if (!isset( $sort_min[$id[$i]] )) $sort_min[$id[$i]] = $sort[$i]; $sum[$id[$i]] += $data[$i]; } // 出力 for ( $i =0; $i < $cnt; $i++ ) { echo $id[$i]; echo ':'; echo $data[$i]; echo ':'; echo $sort[$i]; echo ':'; echo ( $sort[$i] == $sort_min[$id[$i]] ? $sum[$id[$i]] : '--'); echo "\n"; }
出力結果
1:10:1:36 2:20:2:30 1:12:3:-- 3:25:4:30 2:10:5:-- 1:14:6:-- 3:5:7:--
質問にある求めたい結果が、質問にある主旨と違うような気がします。
下記のスクリプトをお試しください。
<?php $id = array(1,2,1,3,2,1,3); $data = array(10,20,12,25,10,14,5); $sum = array(); //集計用配列の初期化 $hoge = array(); for ($i = 0; $i < $n; $i++) $hoge[$i] = 0; //集計 $n = count($id); for ($i = 0; $i < $n; $i++) $hoge[$id[$i]] += $data[$i]; //配列$sumに代入 for ($i = 0; $i < $n; $i++) $sum[$i] = $hoge[$id[$i]]; //結果表示 echo 'id,data,sort,sum<br />'; for ($i = 0; $i < $n; $i++) { echo $id[$i] . ',' . $data[$i] . ',' . $sort[$i] . ',' . $sum[$i] . '<br />'; } ?>
たとえばデータがこんな感じですと、
id,data,sort
----------------
1,10,1
2,20,2
1,12,3
3,25,4
2,10,5
1,14,6
3,5,7
8,6,8
15,7,9
12,29,10
8,32,11
5,1,12
以下のコードを実行することによって、
<?php $id=array(1,2,1,3,2,1,3,8,15,12,8,5); $data=array(10,20,12,25,10,14,5,6,7,29,32,1); function transverse_matrix($array){ return call_user_func_array('array_map',array_merge(array(null),$array)); } $unique=array_unique($id); $sum=array(); $table=array($id,$data); $table=transverse_matrix($table); foreach($unique as $u){ foreach($table as $t){ if($u == $t[0]){ $sum[$u]+=$t[1]; } } } print_r($sum); ?>
-----------------------
こういう結果が得られます。
//配列sumの中身 Array ( [1] => 36 [2] => 30 [3] => 30 [8] => 38 [15] => 7 [12] => 29 [5] => 1 )
たとえばid=8の合計を得たい場合は、echo $sum[8]; とすれば38がでます。
仮にidがcatとかdogであっても……つまりデータベースが
id,data,sort
----------------
cat,10,1
2,20,2
cat,12,3
dog,25,4
3,5,5
みたいな形式であっても、上のプログラムを使えば
echo $sum['cat'];とすれば 4が出力されます。
使用しているのがmysqlであれば、updateすることで変更を反映させることができます。